This question already has answers here:
Why do I get a segmentation fault when writing to a string initialized with “char *s” but not “char s[]”?
(17个答案)
2年前关闭。
当我将char *文字传递给trim()时,它会出现段错误,但是当我发送数组指针时,它为什么起作用?
(17个答案)
2年前关闭。
当我将char *文字传递给trim()时,它会出现段错误,但是当我发送数组指针时,它为什么起作用?
int main(void){
/* If instead I have a char s[100] = "Hi ";
* it works as intended so why does it not work when i pass this.*/
char *s = "Hi ";
printf("<%s>\n", s);
trim(s);
printf("<%s>\n", s);
}
/* Trims all white-space off at end of string. */
void trim(char *s){
while (*s != '\0') ++s;
--s;
while (*s == ' ') --s;
*(++s) = '\0';
}
最佳答案
修改字符串文字的内容是C中未定义的行为,这意味着它可能导致任何不当行为,包括崩溃。从概念上讲,字符串文字是cost char *
,但由于历史原因,其类型为非常量。这意味着将字符串文字分配给char *
变量时不会出错,但是实际编写的程序没有有效的C程序。
崩溃的直接原因是编译器选择将字符串文字放置在只读存储器中。此类内存由操作系统保护,尝试修改该内存的程序会自动终止。
关于c - 为什么当我输入指向字符串文字的指针时程序会返回段错误,而不是当我输入指向数组的指针时却返回seg错误? ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49934030/
10-15 02:08