我是C新手,我想执行此任务:声明并初始化一个字符串,然后将每个字符串元素重新分配给一个新值.
以这种方式编写代码:
char *str = "geeksforgeeks\0"; for (int i = 0; str[i] != '\0'; ++i) { str[i] = 'a'; }
抛出分段错误.
但是如果我以这种方式编写代码:
char string[] = "geeksforgeeks\0"; char *str = string; for (int i = 0; str[i] != '\0'; ++i) { str[i] = 'a'; }
程序行为正确.
还有这段代码:
char str[] = "geeksforgeeks\0"; for (int i = 0; str[i] != '\0'; ++i) { str[i] = 'a'; }
行为正确.
两者有什么区别?不应该相同吗?
如果你有:
char *str = "geeksforgeeks\0";
该字符串(通常)存储在只读内存中,当您尝试修改它时会出现分段错误.(\0
实际上不需要;字符串末尾有两个空字节.)
最简单的解决方法是使用数组而不是常量字符串(这基本上就是你在第二种工作情况下所做的):
char str[] = "geeksforgeeks";
请注意,由于字符串不可修改,因此您应该将其用于字符串:
const char *str = "geeksforgeeks";