我们可以将const char *转换为char *并更改内容:这是安全操作吗?

时间:2013-12-05 00:03:48

标签: c

char *p, *y;

const char *x ;

p = (char *) malloc(5);
snprintf(p, 4, "test");

x = p;

y = (char *) x;

snprintf(y, 4, "abcd");

我们可以将const char *转换为char *并更改内容吗?

由于 库马尔

3 个答案:

答案 0 :(得分:1)

根据编译器警告级别,它可能会导致构建中断。如果它没有导致构建中断,因为你的警告级别很低,那么我想你最好确定你正在尝试操作一个其他开发人员认为它是常数的var !!

另外请记住,这里将以非空终止字符串结束,请记住我正在为公司编写此代码,其他开发人员迟早会触及它。所以坚持正常的编码标准,避免任何可能浪费你大学时间或未来时间的神秘代码。

答案 1 :(得分:1)

虽然在这种情况下它是安全的,因为我们知道x指向的值不是const ant。将const char *转换为char *然后更改其内容通常是不安全的。这就是const限定符的用途:它向编译器指示指针指向的值不会 - 并且编译器将确保它不能被更改。在某些情况下,编译器可以将其存储在只读存储器中,因此更改它可能会导致分段错误。

如果我们从作业中删除演员表,我们会收到以下警告:

  

警告:赋值从指针目标类型

中丢弃'const'限定符

但是对于演员来说,你基本上告诉编译器你知道的更好并且它会遵守。

这将是一个灾难性错误的(微不足道的)案例:

const char * x = "Hello world!";
// If I now try to change x the compiler will throw an error
char * y = (char *) x; // <-- cast curbs compiler complaints
// I can now change y (and through it x) which will cause undefined behaviour
// as the string in x is most likely placed in read-only memory
y[0] = 'h'; // <-- Problems!

最后,如果你需要这样做,你应该考虑你的计划中真正发生的事情。

答案 2 :(得分:1)

C标准允许你抛弃const限定符。

如果指向对象最初未定义为const且不是字符串文字,则可以使用结果指针修改指向对象。如果对象定义为const或是字符串文字,则不定义行为。