Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在c语言中获取负地址 #包括 内部主(空){ inta[5]={0,1,2,3,4},*p; p=a; printf(“%d\n%d\n%d\n%d\n%d\n%d\n”,p,*p); 返回0; }_C_Arrays_Pointers_Printf - Fatal编程技术网

在c语言中获取负地址 #包括 内部主(空){ inta[5]={0,1,2,3,4},*p; p=a; printf(“%d\n%d\n%d\n%d\n%d\n%d\n”,p,*p); 返回0; }

在c语言中获取负地址 #包括 内部主(空){ inta[5]={0,1,2,3,4},*p; p=a; printf(“%d\n%d\n%d\n%d\n%d\n%d\n”,p,*p); 返回0; },c,arrays,pointers,printf,C,Arrays,Pointers,Printf,当我执行这段代码时,我得到了p的负值。我研究过地址不能是否定的。那我为什么会得到负值呢 %d不是处理指针(地址)的正确格式说明符。您应该使用%p并将相应的参数强制转换为void*以打印地址。为特定格式说明符使用错误的参数类型将调用 引用C11章节§7.21.6.1 […]如果有任何论点 对应转换规范的类型不正确,行为为 未定义 在这段代码中,*p并不表示地址 仅在单个格式字符串中使用%ds无法打印数组。你需要有一个循环。在代码中 #include <stdio.h> int mai

当我执行这段代码时,我得到了p的负值。我研究过地址不能是否定的。那我为什么会得到负值呢

  • %d
    不是处理指针(地址)的正确格式说明符。您应该使用
    %p
    并将相应的参数强制转换为
    void*
    以打印地址。为特定格式说明符使用错误的参数类型将调用

    引用
    C11
    章节§7.21.6.1

    […]如果有任何论点 对应转换规范的类型不正确,行为为 未定义

  • 在这段代码中,
    *p
    并不表示地址

  • 仅在单个格式字符串中使用
    %d
    s无法打印数组。你需要有一个循环。在代码中

    #include <stdio.h>
    int main(void) {
        int a[5] = {0, 1, 2, 3, 4}, *p;
        p = a;
        printf("%d\n%d\n%d\n%d\n%d\n", p, *p);
        return 0;
    }
    
    格式字符串要求5
    int
    s作为参数,而您只提供一个指针和一个
    int
    。FWIW,也为提供的转换说明符调用提供了不足的参数。引用相同的标准

    […]如果格式的参数不足,则该行为为 未定义。[……]

  • 详述,替换

    printf("%d\n%d\n%d\n%d\n%d\n", p, *p);
    

    for(i=0;i<5;i++,p++)
    printf(“%d%p\n”,*p,(void*)p);
    
    不匹配
    printf()
    说明符和参数

    printf(“%d\n%d\n%d\n%d\n%d\n%d\n”,p,*p)需要5
    int
    。代码正在提供一个int*int。结果:未定义的行为

    相反:

     for (i= 0; i < 5; i++, p++)
     printf("%d %p\n", *p, (void *)p);
    

    对于指针,请将
    %p
    printf()一起使用:

    还要确保您的comiler警告处于最高级别。如果将
    %d
    与指针一起使用,您应该会收到警告,然后:

    int a[5] = {0, 1, 2, 3, 4}, *p;
    p = a;
    printf("%p\n%d", (void *)p, *p);
    

    “地址不能是负数”-当然可以。但是,您的代码有未定义的行为,因此您不应该从其输出中得出任何结论。@Mat;有否定地址的例子吗?@haccks:x86_64上地址空间的一半(除非您显然想将它们都视为无符号),您可以使用
    %u
    打印无符号值。
    printf("Pointer %p\nValue: %d\n", (void *) p, *p);
    
    int a[5] = {0, 1, 2, 3, 4}, *p;
    p = a;
    printf("%p\n%d", (void *)p, *p);
    
    warning <code>: 'printf'  : '%d' in format string conflicts with argument 1 of type 'int *'