我们正在处理一个常量指针, 所以它拥有的地址不能改变。 但是引用的内存地址的内容应该是可变的......
但是,在尝试这样做时,我会遇到编译/分段错误。
#include <stdio.h>
#include <stdlib.h>
int main(void) {
char * const c_ptr = "firstValue"; // now c_ptr is a const ptr to an immutable string literal,
//we can't change it unless we declare char [] instead
printf("%s",c_ptr);
*c_ptr="hsdsdsd"; // better to use strcpy(c_ptr, "hsdsdsd");
printf("%s",c_ptr);
return 0;
}
main.c:在功能&#39; main&#39;:
main.c:8:8:警告:赋值在没有强制转换的情况下从指针生成整数[默认启用]
* c_ptr =&#34; hsdsdsd&#34 ;;分段错误(核心转储)
答案 0 :(得分:2)
好吧,指针指向的数据可以针对常量指针进行更改,但是在使用字符串文字初始化时则不会。他们具有类型char *
的相当好奇的属性,但无法改变。
所以,你可以这样做:
char data[10] = "foobar";
char * const ptr = data;
printf("%s\n", ptr); // prints foobar
*ptr = 'z';
printf("%s\n", ptr); // prints zoobar
答案 1 :(得分:1)
首先,C字符串是空终止的char数组,并且你不能分配数组,你必须改变它的每个元素。
此外,通常编译器将字符串文字(如"firstValue"
)放入只读内存部分,因此您无法更改它,您将不得不使用char数组来初始化字符串。
char s[] = "firstValue";
const char*const ptr = s;
ptr[0] = 'z'; // change contents pointed by ptr, or:
strncpy(ptr, "abc", 3);
答案 2 :(得分:1)
char * const c_ptr
表示指向const数据的非const指针。这意味着您将指针变量本身设置为只读,而不是指向数据。
如果你做*c_ptr = 'a'
那么编译器就不会阻止它,因为你告诉它指向的数据是读/写的。在这种情况下不是这样,它是一个字符串文字,写入它将导致未定义的行为,这就是你崩溃的原因。
C11 6.4.5 / 7
如果程序试图修改这样的数组,则行为是 未定义。
通过将声明更改为const char* c_ptr
来修复代码
或者const char* const c_ptr
。
现在事实证明,这个是不可变的,因为如果您现在尝试strcpy(c_ptr, "str")
,您将获得无效的指针转换,因为该函数需要char*
。
*c_ptr="hsdsdsd";
是无意义的,不会在兼容的C编译器上编译,因为您尝试将地址分配给单个char
变量,这是不允许的。 (违反简单赋值规则的约束)。