我是C新手,我想执行此任务:声明并初始化一个字符串,然后将每个字符串元素重新分配给一个新值.
以这种方式编写代码:
char *str = "geeksforgeeks\0";
for (int i = 0; str[i] != '\0'; ++i) {
str[i] = 'a';
}
Run Code Online (Sandbox Code Playgroud)
抛出分段错误.
但是如果我以这种方式编写代码:
char string[] = "geeksforgeeks\0";
char *str = string;
for (int i = 0; str[i] != '\0'; ++i) {
str[i] = 'a';
}
Run Code Online (Sandbox Code Playgroud)
程序行为正确.
还有这段代码:
char str[] = "geeksforgeeks\0";
for (int i = 0; str[i] != '\0'; ++i) {
str[i] = 'a';
}
Run Code Online (Sandbox Code Playgroud)
行为正确.
两者有什么区别?不应该相同吗?
char *str = "geeksforgeeks\0";
此字符串分配在只读 * 内存中,您无法修改它。那里的空终止符也是多余的。
您定义的数组并非如此,这就是它起作用的原因。在数组的情况下,字符串文字被复制到数组所在的内存中 - 您可以修改该数组的内容。所以使用这个
char *str = string;
Run Code Online (Sandbox Code Playgroud)
您指向数组的第一个元素 - 如前所述,它是可修改的(以及数组的所有元素)。
*它们可以不是存储在只读存储器中,取决于平台。但无论如何你都不能修改它们。
如果你有:
char *str = "geeksforgeeks\0";
Run Code Online (Sandbox Code Playgroud)
该字符串(通常)存储在只读内存中,当您尝试修改它时会出现分段错误.(\0实际上不需要;字符串末尾有两个空字节.)
最简单的解决方法是使用数组而不是常量字符串(这基本上就是你在第二种工作情况下所做的):
char str[] = "geeksforgeeks";
Run Code Online (Sandbox Code Playgroud)
请注意,由于字符串不可修改,因此您应该将其用于字符串:
const char *str = "geeksforgeeks";
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
534 次 |
| 最近记录: |