为什么这个字符串反转C代码会导致分段错误?

jam*_*mes 29 c string segmentation-fault

我正在尝试编写代码来反转字符串(我只是想在C编程和指针操作方面做得更好),但我无法弄清楚为什么我会遇到分段错误:

#include <string.h>

void reverse(char *s);

int main() {
    char* s = "teststring";
    reverse(s);

    return 0;
}

void reverse(char *s) {
    int i, j;
    char temp;

    for (i=0,j = (strlen(s)-1); i < j; i++, j--) {
        temp = *(s+i);     //line 1
        *(s+i) = *(s+j);   //line 2
        *(s+j) = temp;     //line 3
    }
}
Run Code Online (Sandbox Code Playgroud)

它是第2行和第3行导致分段错误.我知道可能有更好的方法来做到这一点,但我有兴趣找出我的代码中特别导致分段错误的内容.

更新:我已根据要求包含了调用函数.

AnT*_*AnT 50

只有那段代码没有办法说出来.最有可能的是,您传入的指针指向无效内存,不可修改的内存或其他类型的内存,这些内存无法按照您在此处理的方式进行处理.

你怎么称呼你的功能?

补充:您正在传递指向字符串文字的指针.字符串文字是不可修改的.你不能反转字符串文字.

传入指向可修改字符串的指针

char s[] = "teststring";
reverse(s); 
Run Code Online (Sandbox Code Playgroud)

这已经在这里被解释为死亡."teststring"是一个字符串文字.字符串文字本身是一个不可修改的对象.实际上,编译器可能(并将把它)放在只读存储器中.初始化这样的指针时

char *s = "teststring";
Run Code Online (Sandbox Code Playgroud)

指针直接指向字符串文字的开头.s在一般情况下,任何修改指向的内容的尝试都被视为失败.你可以阅读它,但你不能写入它.因此,强烈建议仅使用指针到const变量指向字符串文字

const char *s = "teststring";
Run Code Online (Sandbox Code Playgroud)

但当你宣布你s的时候

char s[] = "teststring";
Run Code Online (Sandbox Code Playgroud)

你得到一个完全独立的数组,s位于普通的可修改内存中,只是用字符串文字初始化.这意味着该独立可修改数组s将从字符串文字中复制其初始值.之后,您的s数组和字符串文字继续作为完全独立的对象存在.文字仍然是不可修改的,而你的s数组是可修改的.

基本上,后一种声明在功能上等同于

char s[11];
strcpy(s, "teststring");
Run Code Online (Sandbox Code Playgroud)


Jar*_*Par 9

由于多种原因,您的代码可能是segfaulting.以下是我想到的

  1. s为NULL
  2. s指向一个保存在只读内存中的const字符串
  3. s不是NULL终止

我认为#2是最有可能的.你能告诉我们反向的呼叫站点吗?

编辑

根据您的样本#2绝对是答案.C/C++中的字符串文字不可修改.适当的类型实际上是,const char*而不是char*.您需要做的是将可修改的字符串传递到该缓冲区.

快速举例:

char* pStr = strdup("foobar");
reverse(pStr);
free(pStr);
Run Code Online (Sandbox Code Playgroud)