【发布时间】:2012-10-24 05:33:01
【问题描述】:
#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