截断字符串会导致分段错误

Hui*_*ang 1 c string truncate char segmentation-fault

我想在C中编写一个函数,将输入字符串截断为32个字符,但下面的代码给出了一个分段错误.谁能解释为什么会如此?

void foo (char *value){
    if (strlen(value)>32) {
        printf("%c\n", value[31]); // This works
        value[31] = '\0';          // This seg faults
    }
}
Run Code Online (Sandbox Code Playgroud)

dbu*_*ush 6

如果你这样称呼你的函数:

char str[] = "1234567890123456789012345678901234567890";
foo(str);
Run Code Online (Sandbox Code Playgroud)

它会工作正常.但如果你这样称呼它:

char *str = "1234567890123456789012345678901234567890";
foo(str);
Run Code Online (Sandbox Code Playgroud)

这可能会导致段错误.

这里的区别在于,在前一种情况下str是一个char数组,而在后一种情况下str是一个指向字符串常量的指针.字符串常量通常位于内存的只读部分,因此尝试修改它会导致核心转储.