设置后如何更改char * const的内容(C)

时间:2017-04-05 08:53:54

标签: c pointers

我们正在处理一个常量指针, 所以它拥有的地址不能改变。 但是引用的内存地址的内容应该是可变的......

但是,在尝试这样做时,我会遇到编译/分段错误。

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

     

分段错误(核心转储)

3 个答案:

答案 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变量,这是不允许的。 (违反简单赋值规则的约束)。