我写了以下代码:
int main()
{
char *str = "hello";
str[0] = 'H';
printf("%s\n", str);
}
Run Code Online (Sandbox Code Playgroud)
这给了我一个分段错误,我不明白为什么.
str是pointer to char不是const char.即使是这样的情况也不应该像下面的程序那样给出编译错误:
int main()
{
const char *str = "hello";
str[0] = 'H';
printf("%s\n", str);
}
Run Code Online (Sandbox Code Playgroud)
它给出了一个错误:assignment of read-only location *str.
编辑
如果我的代码将指针放在只读位置,我不应该得到编译错误?
您指定一个指向常量字符串的指针(它作为文本的一部分,因此不是可写内存).
修复char str[] = "hello";此问题将在堆栈上创建常量字符串的ar/w副本.
你做的是一个完全有效的指针赋值.编译器不知道的是,在标准系统中,常量字符串放在只读存储器中.在嵌入式(或其他奇怪的)系统上,这可能是不同的.
根据您的系统,您可以使用mprotect并将指针目标上的VM标志更改为可写.因此编译器允许使用此代码,但您的操作系统不会.
| 归档时间: |
|
| 查看次数: |
157 次 |
| 最近记录: |