gpt4 book ai didi

c - 应用于数组类型的 sizeof

转载 作者:太空狗 更新时间:2023-10-29 15:57:50 24 4
gpt4 key购买 nike

c11 标准说 sizeof,

"when applied to an operand that has array type, the result is thetotal number of bytes in the array"

  • (6.5.3.4,第 4 点)。

脚注 (103) 说:

"When applied to a parameter declared to have array or function type,the sizeof operator yields the size of the adjusted (pointer) type".

我从中得出,当应用于数组类型时,sizeof 给出了数组的大小(元素数 x 元素的大小),但应用于声明为数组类型的参数时,它给出了指针的大小。

我的问题:

由于脚注,怎么可能有一个不产生指针大小的数组类型的对象?

我觉得在某些情况下我无法信任 sizeof 运算符而不知道这一点。

谢谢。

编辑:我想我应该澄清我的担忧,如果定义了“int a[4]”,那么我从响应中看到 sizeof a==4*sizeof(int),但是 sizeof(a+0 )?似乎 sizeof(a+1) 必须被评估为一个指针。我关心的是数组衰减为指针的函数调用以外的情况。

最佳答案

响应您的更新(关注 sizeof(foo+1) 类型的情况:

是的,应用于 array_name + intsizeof 等同于 sizeof &(array_name[int]);,基于一个数组,在这些情况下会衰减为指针。同样,要从数组中获取实际值,您不必编写 arr_name + 1,而是编写 *(arr_name + 1)

因此,考虑到脚注,sizeof 何时会产生实际的数组大小(以字节为单位)?为此,请查看标准中关于数组衰减为指针的内容:

Except when it is the operand of the sizeof 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 (sizeof array_var)
  • 取消引用指向数组的指针 (sizeof *(&array_var)) 注意:当您将指向数组的指针传递给另一个函数时,这也适用,但并不总是最好的要走的路(见下面的例子)
  • 字符串文字(如 char foo[] = "foobar"; 中的右值 => sizeof("foobar");)

在所有其他情况下(AFAIK),数组衰减为指针,sizeof 将产生指针的大小:

  • 数组算术 => 指针算术 (sizeof (array_var +1 ))
  • 将数组传递给函数(退化为指针)
  • ...

将数组传递给函数

因此,使用一元 & 运算符,可以将指向数组的指针传递给函数,但很少有人这样做。不过,还是举个例子:

void pointer_to_array(char (*ptr)[]);//pointer to array type
void error_p_to_arr(char (*ptr)[]);

int main ( void )
{
char str[] = "some random string";//array of 18 bytes
printf(
"Sizeof array %zu\n",
sizeof str
);
pointer_to_array(&str);
return 0;
}
//we need to specify the exact type, including size!
//replace 18 with 10, you're fine, but use 20 and you're in trouble
void pointer_to_array(char (*ptr)[18])
{
printf(
"sizeof argument: %zu\nsizeof array %zu",
sizeof ptr,//4 or 8
sizeof *ptr//18!! YaY
);
}
//if we don't specify the array size here
void error_p_to_arr(char (*ptr)[])
{
printf(
"sizeof argument: %zu\nsizeof array %zu",
sizeof ptr,//4 or 8
sizeof *ptr//ERROR!
);
}

后者 sizeof *ptr 将导致错误(“无效应用‘sizeof’到不完整类型‘char[]’”)。因为这种传递数组的方式很容易出错(必须在所有地方定义正确的大小),所以更常见的做法是简单地让数组衰减,然后传递第二个参数:

void common_usage(const char *ptr, size_t arr_len);
int main ( void )
{
char str[] = "some random string";
common_usage(str, sizeof str/sizeof *str);
return 0;
}

它看起来更简洁,更常见,也更容易维护。

查看示例 here

关于c - 应用于数组类型的 sizeof,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28187738/

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