C++ strlen和sizeof对指针和指针的不同回答;基于数组的字符串初始化
可能的重复项:C++ strlen和sizeof对指针和指针的不同回答;基于数组的字符串初始化,c++,c,C++,C,可能的重复项: 基本上,我是这样做的 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 我无法解释为什么str1的大小为4。请解释它们之间的区别。str1是指向字符的指针,系统上指针变量的大小为4。 str2是堆栈上的字
基本上,我是这样做的
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
我无法解释为什么str1的
大小为4。请解释它们之间的区别。str1
是指向字符的指针,系统上指针变量的大小为4。
str2
是堆栈上的字符数组,它存储8个字符,“s”、“a”、“n”、“j”、“e”、“e”、“v”和“\0”,因此其大小为8
重要的是要注意,指向不同数据类型的指针的大小将是相同的,因为它们指向不同的数据类型,但它们只占用该系统上指针的大小。因为sizeof提供了数据类型的字节大小。str1的数据类型为char*,共4个字节。相反,以字符为单位给出字符串的长度,不包括空终止符,因此为7。str2的sizeof是8字节的字符数组,它是包括空终止符在内的字符数
请参阅C-FAQ中的以下条目:
试试这个:
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));
strlen()
给出字符串的长度,即7
sizeof()
是一个编译时运算符,sizeof(str1)
给出实现上指针的大小(即4
)
sizeof(str2)
给出数组的大小,数组的大小是8*sizeof(char)
,即8
[包括num
终止符]sizeof(str1)是sizeof(char*)
而str2的大小是sizeof(字符数组)
sizeof(字符数组)应等于strlen(字符数组)+1(空终止)。如果您将char数组传递给一个函数,它的大小(如sizeof所示)将会改变。原因是char数组只作为char*传递。@Eugen Constantin Dinca:这不是一个重复,因为这个问题是关于sizeof运算符及其工作原理的。如果我运行代码,我在每一行都会得到相同的输出-
7 8/7 8
;当然,这是一台64位机器。这可能会让你对正在发生的事情产生误解@罗伯特:这个问题针对的是另一个问题答案中所包含的部分。需要补充的是,指针的大小是4,因为作者的机器是32位的,对于64位的机器,指针的大小总是8。这是表示32位或64位体系结构中的内存地址所需的字节数%d
格式说明符不正确,无法打印sizeof
的结果sizeof
返回size\u t
,应使用C99标准引入的%zu
说明符显示该值
char *str1 = "Sanjeev";
printf("%d %d\n",strlen(str1),sizeof(str1));
char str2[] = "Sanjeev";
printf("%d %d\n",strlen(str2),sizeof(str2));