C 为什么sizeof(指针)返回不正确的值?

C 为什么sizeof(指针)返回不正确的值?,c,string,sizeof,C,String,Sizeof,可能重复: 在windows7 mingw环境中,我尝试了以下方法: char str[] = "hello"; sizeof(str)的值是6,而不是4或8 这是如何发生的?sizeof(str)返回字符串中包含终止空字符的字节数。也就是说,“hello\0”表示数组中的6个字节 如果你有 char* str = "hello"; 然后sizeof(str)将返回指针str中的字节数(对于32位系统为4) 你可能会发现这个问题很有趣。这是因为str是一个字符数组sizeof(array)

可能重复:

在windows7 mingw环境中,我尝试了以下方法:

char str[] = "hello";
sizeof(str)
的值是6,而不是4或8

这是如何发生的?

sizeof(str)
返回字符串中包含终止空字符的字节数。也就是说,
“hello\0”
表示数组中的6个字节

如果你有

char* str = "hello";
然后
sizeof(str)
将返回指针
str
中的字节数(对于32位系统为4)


你可能会发现这个问题很有趣。

这是因为
str
是一个
字符数组
sizeof(array)
将告诉您数组占用的字节数,并且由于
str
是一个
chars
数组,每个元素只有1个字节,包括空终止字符,共6个字节

您可以使用:
sizeof(array)/sizeof(array[0])
获得数组中的元素数,因此可以更明确地编写:
sizeof(str)/sizeof(str[0])
,但是如果
str
是一个字符数组,那么这就相当于
sizeof(str)

请注意,此通常不适用于C字符串,对于字符串的长度,请使用
strlen
。例如:

char *str = "hello";
sizeof(str);  // returns 4, since str is declared as char*, not char[]
“sizeof()”运算符返回字节数。对于字符串,它恰好是6(5个字符加上空字节)。对于6个元素的整数数组,它是24(至少在我的32位Linux系统上是这样)。对于指针,它将是4(同样,对于32位系统)


这一个经常出现…为什么你认为它应该是4或8?然而,如果我有一个函数接受一个字符数组,当我把str传递给它时,sizeof的值是4…@Levon No,数组第一个元素的地址。相同的数值,不同的类型(因此指针算法也不同)。@Levon正如我所说,指针的数值将是相同的,但它肯定不是相同的指针(毕竟,对于指针上的许多重要操作,它的行为非常不同),因此,我要谨慎地说,这是同一个地址,因为这两个概念经常(在许多其他情况下,没有不良影响)合并在一起。
#include <stdio.h>

int
main (int argc, char *argv[])
{
  char str[] = "Hello";
  char *s = "Hello";
  int a[] = {1, 2, 3, 4, 5, 6};
  printf ("sizeof (str)=%d, sizeof(s)=%d, sizseof(a)=%d\n",
    sizeof (str), sizeof(s), sizeof(a));
  return 0;
}
sizeof (str)=6, sizeof(s)=4, sizeof(a)=24