Do these statements about pointers have the same effect?
这个……
1
| char* myString ="hello"; |
…和这个效果一样?
1 2
| char actualString[] ="hello";
char* myString = actualString; |
- 看起来你的代码很容易编译和测试……为什么不测试它呢?
- 这个问题问了很多!~
- 他并不是在问它是有效的,还是编译的。他在问两种说法是否有相同的效果(也就是说工作方式相同)。答案是否定的。
- 有些关联:stackoverflow.com/questions/2073079/…
- "你为什么不测试它?"当涉及到C和C++时,是一个危险的问题。标准未定义许多行为(因此程序调用行为通常是错误的),但这可能在简单测试代码时并不明显。
不。
1 2
| char str1[] ="Hello world!"; //char-array on the stack; string can be changed
char* str2 ="Hello world!"; //char-array in the data-segment; it's READ-ONLY |
第一个示例在堆栈上创建一个大小为13*sizeof(char)的数组,并将字符串"Hello world!"复制到其中。第二个示例在堆栈上创建一个char*,并将其指向可执行文件的数据段中的一个位置,该段包含字符串"Hello world!"。第二个字符串是只读的。
1 2
| str1[1] = 'u'; //Valid
str2[1] = 'u'; //Invalid - MAY crash program! |
- 我假设你是指char str1[],而不是char[] str1。
- 这就是为什么有些编译器警告您,除非您编写const char* blah="blahblah"。
- 这个答案解释了背后的原因。
- 这也是为什么在C++中,初始化一个EDCOX1的3指向指向一个字符串文字是有必要的,因为它要求指针是EDCOX1,4。我理解,与这个C问题不完全相关;但是它确实证明了场景的事实。
- 值得一提的是:在第一个示例中,str1指针不能更改。那就是我不能做str1=其他的指针。在第二个例子中,我可以做str2=someone_other_指针。
- 一个小小的诡辩——"在堆栈上创建一个数组并复制"…仅当声明是函数的本地声明时。一般来说,第一个变量声明并初始化数组变量,第二个变量声明并初始化指针。第一个字符(在任何上下文中)与char str1[13]='h'、'e'、'l'/…/'!',0 };
不,第一个给你一个指向const数据的指针,如果你通过这个指针改变了任何字符,那就是未定义的行为。第二个是将字符复制到一个数组中,这个数组不是const,因此您可以随意更改任何字符(直接在数组中或通过指针),而不会产生不良影响。
这是不同的,因为第一个示例中myString指向的未命名数组是只读的,具有静态存储持续时间,而第二个示例中的命名数组是可写的,具有自动存储持续时间。
另一方面,这更接近于等效:
1 2
| static const char actualString[] ="hello";
char* myString = (char *)actualString; |
不过,情况仍然不完全相同,因为由字符串文本创建的未命名数组不一定是唯一的,而显式数组则是唯一的。所以在下面的例子中:
1 2 3 4 5 6
| static const char string_a[] ="hello";
static const char string_b[] ="hello";
const char *ptr_a = string_a;
const char *ptr_b = string_b;
const char *ptr_c ="hello";
const char *ptr_d ="hello"; |
ptr_a和ptr_b保证比较不相等,而ptr_c和ptr_d可以相等或不相等,两者都有效。
不,第一个不能修改myString指向的字符串,第二个可以修改。在这里阅读更多。