在c中获得负面地址

roh*_*079 3 c arrays printf pointers

#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;
}
Run Code Online (Sandbox Code Playgroud)

当我执行此代码时,我得到p的负值.我研究过地址不能否定.那为什么我有一个负值

Sou*_*osh 5

  1. %d不是处理指针(地址)的正确格式说明符.您应该使用%p并转换相应的参数来void*打印地址.对特定格式说明符使用错误的参数类型会调用未定义的行为.

    引用C11章节§7.21.6.1

    [...]如果任何参数不是相应转换规范的正确类型,则行为未定义.

  2. *p无论如何,在此代码中,并不表示地址.

  3. 您只能%d在单个格式字符串中使用s 来打印数组.你需要一个循环.在你的代码中,

    printf("%d\n%d\n%d\n%d\n%d\n", p, *p);
    
    Run Code Online (Sandbox Code Playgroud)

    格式字符串需要5 int秒作为参数,而您只提供一个指针和一个int.FWIW,为提供的转换说明符提供的参数不足也会调用未定义的行为.引用相同的标准,

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

详细说明,替换

 printf("%d\n%d\n%d\n%d\n%d\n", p, *p);
Run Code Online (Sandbox Code Playgroud)

通过

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