这段代码是否使用 sizeof 运算符定义得很好?
Is this code well defined by using sizeof operator?
#include <stdio.h>
void test(int arr[]);
int main ()
{
int *arr[3];
int ar1[2] = { 1, 2 };
int ar2[3] = { 3, 4, 5 };
int vla[ar2[1]];
arr[0] = ar1;
arr[1] = ar2;
arr[2] = vla;
for (int i = 0; i < 3; i++)
{
test(arr[i]);
}
}
void test(int arr[])
{
printf("%zu\r\n", sizeof(arr));
}
如标题所说:有效吗?如果是这样,有没有办法通过在函数参数上使用 sizeof
来使 test()
输出不同的值,就像在数组上一样?
是的,它是有效的,并且会以字节为单位给出 int
指针的大小(这就是 arr
参数的类型,C 中没有数组参数)。 1
要使用 sizeof
获取数组的大小(以字节为单位),参数必须是实际数组,而不是指针。
因此,如果不传递指定大小的额外参数,则无法获取作为函数内部参数传递的数组的大小。
所以,
is there a way to make test()
output different values by using sizeof on function argument handed in like on array?
没有。 (不编辑函数体。)
1 如果您想知道如何将数组作为指针参数传递,那是因为隐式 array-to-pointer 转换,称为 array decaying.
Is this:
void test(int arr[]) {
printf("%d\r\n", sizeof(arr));
}
valid?
它不是有效的1 代码,但它等效于:sizeof(int*)
,不是数组的大小,arr
,因为你将数组作为参数传递,它 衰减到指针 2 即它丢失了有关整个数组大小的信息。将此信息传递到函数中的唯一方法是通过附加的第二个参数。
Is there a way to make test()
output different values by using sizeof
on function argument handed in like on array?
如果你想打印你传递的数组的大小,你可以使用类似的东西:sizeof(array)
作为函数的第二个参数,函数签名是:
void test(int arr[], size_t size);
您可以将上面的内容作为第二个参数插入并获取第一个参数的大小。
1. size_t
(sizeof()
的返回类型)和 int
(与 printf(),
中的说明符 "%d"
匹配的预期类型之间存在类型不匹配,这导致到未定义的行为。
2。 arr[]
在函数外部将整个数组表示为一个对象,这就是为什么如果你应用 sizeof()
你将获得整个数组的大小,但是,当作为参数传递时,arr
衰减到数组第一个元素的指针,如果你应用 sizeof()
你会得到指针类型的大小。
Is this code well defined by using sizeof operator?
迂腐地:没有
sizeof()
returns 输入 size_t
。 "%d"
需要类型 int
。使用 mis-match 类型会导致未定义的行为 (UB)。第 1 步:使用匹配说明符
// printf("%d\r\n", sizeof(arr));
printf("%zu\r\n", sizeof(arr));
// or
printf("%d\r\n", (int) sizeof(arr));
下面打印指针的大小arr
。 main()
中的代码不相关。
void test(int arr[]) {
printf("%zu\r\n", sizeof(arr));
}
// or simply: remove (), \r of dubious value
printf("%zu\n", sizeof arr);
#include <stdio.h>
void test(int arr[]);
int main ()
{
int *arr[3];
int ar1[2] = { 1, 2 };
int ar2[3] = { 3, 4, 5 };
int vla[ar2[1]];
arr[0] = ar1;
arr[1] = ar2;
arr[2] = vla;
for (int i = 0; i < 3; i++)
{
test(arr[i]);
}
}
void test(int arr[])
{
printf("%zu\r\n", sizeof(arr));
}
如标题所说:有效吗?如果是这样,有没有办法通过在函数参数上使用 sizeof
来使 test()
输出不同的值,就像在数组上一样?
是的,它是有效的,并且会以字节为单位给出 int
指针的大小(这就是 arr
参数的类型,C 中没有数组参数)。 1
要使用 sizeof
获取数组的大小(以字节为单位),参数必须是实际数组,而不是指针。
因此,如果不传递指定大小的额外参数,则无法获取作为函数内部参数传递的数组的大小。
所以,
is there a way to make
test()
output different values by using sizeof on function argument handed in like on array?
没有。 (不编辑函数体。)
1 如果您想知道如何将数组作为指针参数传递,那是因为隐式 array-to-pointer 转换,称为 array decaying.
Is this:
void test(int arr[]) { printf("%d\r\n", sizeof(arr)); }
valid?
它不是有效的1 代码,但它等效于:sizeof(int*)
,不是数组的大小,arr
,因为你将数组作为参数传递,它 衰减到指针 2 即它丢失了有关整个数组大小的信息。将此信息传递到函数中的唯一方法是通过附加的第二个参数。
Is there a way to make
test()
output different values by usingsizeof
on function argument handed in like on array?
如果你想打印你传递的数组的大小,你可以使用类似的东西:sizeof(array)
作为函数的第二个参数,函数签名是:
void test(int arr[], size_t size);
您可以将上面的内容作为第二个参数插入并获取第一个参数的大小。
1. size_t
(sizeof()
的返回类型)和 int
(与 printf(),
中的说明符 "%d"
匹配的预期类型之间存在类型不匹配,这导致到未定义的行为。
2。 arr[]
在函数外部将整个数组表示为一个对象,这就是为什么如果你应用 sizeof()
你将获得整个数组的大小,但是,当作为参数传递时,arr
衰减到数组第一个元素的指针,如果你应用 sizeof()
你会得到指针类型的大小。
Is this code well defined by using sizeof operator?
迂腐地:没有
sizeof()
returns 输入 size_t
。 "%d"
需要类型 int
。使用 mis-match 类型会导致未定义的行为 (UB)。第 1 步:使用匹配说明符
// printf("%d\r\n", sizeof(arr));
printf("%zu\r\n", sizeof(arr));
// or
printf("%d\r\n", (int) sizeof(arr));
下面打印指针的大小arr
。 main()
中的代码不相关。
void test(int arr[]) {
printf("%zu\r\n", sizeof(arr));
}
// or simply: remove (), \r of dubious value
printf("%zu\n", sizeof arr);