我有这个疑问:在这种情况下如何获取 char 数组的大小:
#include<stdio.h>
void f(char * x)
{
printf("Size %d\n", sizeof(x)/sizeof(char));
}
main()
{
char x[5] = {'a', 'e', 'i', 'o', 'u'};
f(&x[0]);
}
与我的预期相反,我收到 8 个而不是 5 个甚至 6 个。这里有什么问题?
谢谢!
sizeof(x)
在您的代码中将返回指针的大小,而不是指向char *x
的 char 数组的大小x
并且您的 64 位系统中的指针大小为 8。对于 32 位系统,指针的大小为 4
这里,sizeof()
返回的是指针的大小,而不是原始数组的大小。
f()
知道 指向的数组大小的唯一方法char*
是调用者告诉它:
void f(char * x, size_t size)
{
...
}
main()
{
char x[5] = {'a', 'e', 'i', 'o', 'u'};
f(x, sizeof(x) / sizeof(x[0]));
}
你不能。sizeof
返回指针的大小。
将数组的大小存储在一个变量中并传递它。
我更喜欢这个:
void f(char *x, int size)
{
// ...
}
main()
{
char x[5] = {'a', 'e', 'i', 'o', 'u'};
f(x, 5);
}
你这样理解
void f(char * x, int size_of_array)
{
printf("Size %d\n", size_of_array);
}
main()
{
char x[5] = {'a', 'e', 'i', 'o', 'u'};
f(&x[0], 5);
}
一旦传递了一个数组,它就会衰减为该类型的指针,并且您失去了通过 sizeof 宏获取数组大小的能力。您需要传递元素的数量。如果您的数组是数字类型,您始终可以将数组的大小作为第一个元素传递:
void f(char * x)
{
printf("Size %d\n", x[0]);
}
main()
{
char x[6] = {6, 'a', 'e', 'i', 'o', 'u'};
f(&x[0]);
}
但当然,在这种情况下,更新该元素以确保它符合您的期望会产生额外的开销。
sizeof(x)
给你 char 指针的大小而不是数组的大小。char *
是一个指向字符的指针。如果你这样做char a = 'A';
f(&a);
,它仍然有效。char *
并非旨在仅指向 char 数组,因此sizeof(x)
返回指针的大小而不是指向的内容。