gpt4 book ai didi

c - sizeof-operator 反向行为

转载 作者:太空狗 更新时间:2023-10-29 15:17:18 27 4
gpt4 key购买 nike

我们知道,当我们使用数组时,它保存第一个元素的地址,而 &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;
}

\我不明白为什么请解释

最佳答案

我想你在这里需要知道的是,&array 仍然是一个指针,只是类型不同。

对于像 int arr[]={4,3,2,1,0} 这样的数组

  • 大多数情况下,arr&arr[0] 相同,即int *,但带有sizeof 运算符,它的行为不同(见下面的注释)。当传递给 sizeof 运算符时,它会为您提供整个数组的大小,即本例中的 sizeof(int [4])
  • &arr 的类型是int (*)[4],是一个指针。

所以,要获得数组中元素的数量,你应该做类似的事情

printf ("Number of elements = %zu", sizeof(arr)/sizeof(arr[0]));
/ *(size of the entire array / size of one element in the array) */

引用 C11,第 6.3.2.1 章(强调我的)

Except when it is the operand of the sizeof operator, the _Alignof operator, or the unary & operator, or is a string literal used to initialize an array, an expression that has type ‘‘array of type’’ is converted to an expression with type ‘‘pointer to type’’ that points to the initial element of the array object and is not an lvalue. [...]

也就是说,

  • sizeof 产生类型为 size_t 的结果,您应该使用 %zu 格式说明符来打印结果。
  • 要打印指向对象的指针,您必须使用%p 格式说明符并将相应的参数转换为void *

关于c - sizeof-operator 反向行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57087790/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com