我有这个疑问:在这种情况下如何获得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。这里有什么问题?
谢谢!
答案 0 :(得分:5)
sizeof(x)
将返回指针char *x
的大小,而不是x
指向的char数组的大小
,64位系统中指针的大小为8.对于32位系统,指针大小为4
答案 1 :(得分:3)
这里,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]));
}
答案 2 :(得分:0)
你做不到。 sizeof
返回指针的大小。
将数组的大小存储在变量中并传递它。
我更喜欢这个:
void f(char *x, int size)
{
// ...
}
main()
{
char x[5] = {'a', 'e', 'i', 'o', 'u'};
f(x, 5);
}
答案 3 :(得分:0)
你得到这样的
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]);
}
但当然在这种情况下,更新该元素需要额外的开销,以确保它符合您的预期。
答案 4 :(得分:0)
sizeof(x)
给出了char指针的大小而不是数组的大小。 char *
是指向char的指针。如果您char a = 'A';
f(&a);
,它仍然有效。 char *
并非旨在仅指向char数组,因此sizeof(x)
返回指针的大小而不是它所指向的大小。