指针和数组初始化字符串时,使用strlen和sizeof得到的结果不同。

10

可能是重复问题:
C语言中指针和数组之间的区别
sizeof运算符输出不同结果


基本上,我做了这个......

 char *str1 = "Sanjeev";
 char str2[] = "Sanjeev";
 printf("%d %d\n",strlen(str1),sizeof(str1));    
 printf("%d %d\n",strlen(str2),sizeof(str2));

我的输出结果是

7 4
7 8

我无法解释为什么sizeof str1的结果是4。请解释它们之间的区别。


@Eugen Constantin Dinca:这不是重复问题,因为这个问题是关于sizeof运算符及其工作原理的。 - Robert S. Barnes
如果我运行这段代码,每一行都会得到相同的输出 - 7 8 / 7 8;当然,这是一台64位的机器。这可能会让你误解正在发生的事情! - Jonathan Leffler
@Robert:这个问题只关注其他问题答案覆盖的子集。 - Eugen Constantin Dinca
4个回答

10
因为sizeof给出的是数据类型的字节数。str1的数据类型是char*,长度为4个字节。相比之下,strlen给出的是字符串的长度,不包括空终止符,因此是7。str2的大小是8个字节的char数组,其中包括空终止符的字符数。
请参阅C-FAQ中的这篇文章: http://c-faq.com/~scs/cclass/krnotes/sx9d.html 试试这个:
 char str2[8];
 strncpy(str2, "Sanjeev", 7);
 char *str1 = str2;
 printf("%d %d\n",strlen(str1),sizeof(str1));    
 printf("%d %d\n",strlen(str2),sizeof(str2));

1
%d 是错误的格式说明符,无法打印 sizeof 的结果。sizeof 返回的是 size_t 类型,应该使用 C99 标准引入的 %zu 说明符来显示它。 - Destructor

6

str1是一个指向char类型的指针,在你的系统上,指针变量的大小为4。
str2是一个存储在堆栈中的char类型数组,其存储了8个字符:"s"、"a"、"n"、"j"、"e"、"e"、"v"和"\0",因此其大小为8。

需要注意的是,指向不同数据类型的指针的大小相同,因为它们只占用系统上指针的大小。


需要强调的是,指针的大小为4是因为作者的机器是32位的,对于64位的机器,指针的大小始终为8。这是在32位或64位架构中表示内存地址所需的字节数。 - brita_

2

sizeof(str1) 的大小是 char* 的大小,而 sizeof str2 的大小是 char array 的大小。

char array 的大小应该等于 strlen(char array) + 1(包括 NULL 结尾符)。但是如果你将 char array 传递给函数,它的大小将会改变。原因是 char array 只会作为 char* 传递。


1
 char *str1 = "Sanjeev";
 printf("%d %d\n",strlen(str1),sizeof(str1)); 

strlen() 函数返回字符串的长度,这里是 7。而 sizeof() 是一个编译时运算符,sizeof(str1) 返回指针在你的实现中所占的大小(即 4)。

char str2[] = "Sanjeev";  
printf("%d %d\n",strlen(str2),sizeof(str2));

sizeof(str2) 返回的是数组的大小,即 8*sizeof(char),也就是 8 [包括 NUL 终止符]


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接