-4

可能重复:
是否可以在 C 中修改 char 字符串?

#include <stdio.h>

void reverseStr(char *str);

main()
{
  reverseStr("abcdef");
}

void reverseStr(char *str) {
    char *tmp = str;
    char curr;
    while (*tmp != '\0') {
        tmp++;
    }
    tmp--;
    while (tmp > str) {
        curr = *str;
        *str = *tmp;
        *tmp = curr;
        str++;
        tmp--;
    }    
}

当我运行它时,我得到:

/usr/bin/runit/srun_c: line 12:  2809 Segmentation fault      /tmp/run_c_executable

到底是怎么回事?我正在为面试练习,我的 C 生疏了,想练习一些简单的东西,但我一辈子都搞不明白。我注意到当我注释掉该*str = *tmp;行时,段错误消失了,我不明白为什么会导致段错误。帮助表示赞赏。

4

3 回答 3

5

您不能修改常量字符串。改用 char 数组:

char str[] = "abcdef";

reverseStr(str);
于 2012-10-24T05:34:09.880 回答
3

您不能修改字符串文字——它们存储在只读内存中。

利用:

char str[] = "abcdef";

reverseStr(str);
于 2012-10-24T05:34:29.843 回答
3

您的反转功能看起来不错。但正是您调用导致此崩溃的函数的方式。您正在向函数传递一个只读的字符串文字。修改字符串文字是一种未定义的行为,在您的情况下表现为崩溃。

改变

reverseStr("abcdef");

char str[] = "abcdef";
reverseStr(str);

您将字符数组传递给函数的位置。

于 2012-10-24T05:34:37.883 回答