在这种情况下如何获取char数组大小?

时间:2013-04-01 13:39:13

标签: c arrays char sizeof

我有这个疑问:在这种情况下如何获得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。这里有什么问题?

谢谢!

5 个答案:

答案 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)返回指针的大小而不是它所指向的大小。