Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ strlen和sizeof对指针和指针的不同回答;基于数组的字符串初始化_C++_C - Fatal编程技术网

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));