【问题标题】:Reverse C string - simple bug [duplicate]反向C字符串-简单的错误[重复]
【发布时间】:2012-10-24 05:33:01
【问题描述】:

可能重复:
Is it possible to modify a string of char in C?

#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; 行时,段错误消失了,我不明白为什么会导致段错误。 帮助表示赞赏。

【问题讨论】:

  • 如果我无法找到自己为什么这段代码不起作用,我不会在面试中声称对 C 有很好的了解。您绝对应该使用警告和调试信息(例如gcc -Wall -g)进行编译,并能够在声称拥有 C 工作知识之前使用gdb。
  • @BasileStarynkevitch 仅供参考,我是一名学生,上学期刚学了 C。整个夏天都没用。对不起这个简单的问题:)
  • 我仍然建议避免在面试中撒谎。假设你学过一些 C 但不是很了解。如果面试你的人有能力,他们会很容易发现你并不真正了解 C。你的 bug 并不像标题所说的“奇怪”,这是显而易见的。如果你自己找不到这样的微不足道的bug,你就不应该声称自己了解C。知道C至少可以在没有任何帮助的情况下纠正这样一个简单的bug。
  • @BasileStarynkevitch 我从来没有声称自己很了解它。据我所知,实习职位不是一个 C 重的职位——公司更喜欢使用 C 作为我所读过的面试语言——不用说我对此感觉不太好。我很欣赏这个建议,并认为你是完全正确的。并且我从标题中取出了“奇怪”。
  • 我相信,如果您至少无法在没有帮助的情况下单独纠正该错误,那么您就不能说“我知道 C”。我要补充的是,如果您一开始就能够编写如此糟糕的代码,那么您不应该说“我很懂 C”。

标签: c string pointers segmentation-fault


【解决方案1】:

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

char str[] = "abcdef";

reverseStr(str);

【讨论】:

  • 你一定是在我的肩膀上阅读!
【解决方案2】:

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

用途:

char str[] = "abcdef";

reverseStr(str);

【讨论】:

    【解决方案3】:

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

    改变

    reverseStr("abcdef");
    

    到

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

    将字符数组传递给函数。

    【讨论】:

      猜你喜欢
      • 2019-12-09
      • 1970-01-01
      • 2012-08-24
      • 1970-01-01
      • 2015-05-10
      • 1970-01-01
      • 2011-08-08
      • 1970-01-01
      • 2011-11-19
      相关资源
      最近更新 更多