Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/143.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++ C++;字符数组和字符指针之间的简单大小差异 char*test=“test”; cout_C++_String_Sizeof - Fatal编程技术网

C++ C++;字符数组和字符指针之间的简单大小差异 char*test=“test”; cout

C++ C++;字符数组和字符指针之间的简单大小差异 char*test=“test”; cout,c++,string,sizeof,C++,String,Sizeof,test是指向字符串文本的指针,而不是字符串文本(achar[]): sizeof(char*)为4,与测试相关 sizeof(char[5])是5,与test2[] 因此,45是输出 第一个显示指针的大小,而不是数组的大小。在第二种情况下,显示数组的大小。第一个测试是指向char的指针。指针的大小取决于您的体系结构,但通常为4或8字节。在您的情况下,它会导致“4”。请注意,将字符串文本分配给char*本身是不安全的,您应该始终将其分配给char const* 第二个test2实际上是一个5

test
是指向字符串文本的指针,而不是字符串文本(a
char[]
):

  • sizeof(char*)
    4
    ,与
    测试相关
  • sizeof(char[5])
    5
    ,与
    test2[]

因此,
45
是输出

第一个显示指针的大小,而不是数组的大小。在第二种情况下,显示数组的大小。

第一个
测试是指向char的指针。指针的大小取决于您的体系结构,但通常为4或8字节。在您的情况下,它会导致“4”。请注意,将字符串文本分配给
char*
本身是不安全的,您应该始终将其分配给
char const*

第二个
test2
实际上是一个5个字符的数组。数组的大小是其元素数乘以其大小。在您的情况下,它会导致“5”

综合起来,您得到的输出为“45”,因为您从未向输出流写入任何其他内容(如换行符)

一旦您意识到通过编写
chartest*=“test”要求编译器在堆栈的其他位置放置一个指向字符串的指针。使用
chartest2[]=“test”
您要求它将整个字符串的副本放在堆栈上-毕竟字符串中的每个字符都必须放在数组中


如果您希望更改字符串,这一点尤其重要:如果禁止,请更改实际字符串文字,因为它可能会在代码中的其他点重新使用(由您自己或编译器),这也是为什么在引用字符串文字时应始终使用
char const*
的原因。因此,您必须使用自己的字符串文本副本创建一个数组并进行更改。

在32位系统上,指针的大小为32位或4字节,因此测试的大小为4。另一方面,test2是一个带有NUL终止字符的数组,其大小为5

char * test = "test";
cout << sizeof(test);


char test2[] = "test";
cout << sizeof(test2);