在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; }
当我执行这段代码时,我得到了p的负值。我研究过地址不能是否定的。那我为什么会得到负值呢在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
%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;
}
格式字符串要求5int
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)代码>需要5int
。代码正在提供一个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 *'