【发布时间】:2019-07-18 05:41:11
【问题描述】:
我们知道,当我们使用数组时,它保存第一个元素的地址,而 &array 存储整个数组地址,当我在 printf 中使用它时它是正确的,但在 sizeof 运算符中它是相反的行为,为什么
我在 Windows 7 上使用带有 GCC 的代码块
int main(void)
{
int c[5];
printf(" %d %d %d %d\n",c,c+1,&c,&c+1);\\when we add 1 in "c" it add more 4 bytes and when "&c+1" it add 20 byte witch is true
printf(" %u %u ",sizeof(c),sizeof(&c));\\But when we print first element size (with "c") it give 20 byte and when print (With "&c") whole arry size it give 4 byte
return 0;
}
\我不明白为什么请解释
【问题讨论】:
-
因为 “我们知道 [...]” 的事情并不准确。您必须重新阅读
arr和&arr到底是什么 -
OT:在循环中打印相同的内容似乎很奇怪。您是否打算在
printf语句中使用i? -
sizeof(arr)/sizeof(&arr)是错误的,没有意义。它像正确的东西,所以很容易混淆 -
您为
sizeof使用了错误的格式说明符,因此行为未定义。sizeof表达式的类型为size_t,而不是int。您的编译器应该对此发出警告。您应该认为您打印的所有地址都不正确。 -
@alk 哦,看起来有一个单独的
gcc警告选项:-Wformat-signedness。启用后,它将给出您想要的已签名与未签名警告。但请注意,-Wall不会启用此警告。