【问题标题】:Getting segmentation fault (core dumped) and don't understand why得到分段错误(核心转储)并且不明白为什么
【发布时间】:2017-04-04 12:23:25
【问题描述】:

我正在尝试反转一个字符串,我的程序将编译并执行它应该做的所有事情,但是,当我运行应用程序时,我得到Segmentation fault (core dumped),我理解错误的含义,但我不知道'不明白它来自哪里:

#include <stdio.h>
#include <string.h>

char *reverse(char *str)
{
    char tmp, *src, *dst;
    size_t len;

    if (str != NULL)
    {
        len = strlen(str);
        if (len > 1)
        {
            src = str;
            dst = src + len - 1;

            while (src < dst)
            {
                tmp = *src;
                *src++ = *dst;
                *dst++ = tmp;
            }
        }
    }
    return str;
}

int main(int argc, char *argv[])
{
    char *str[] = {"a", "ab", "abc", "test", "another test"};
    int i;
    char s[10000];
    for (i=0; i < sizeof(str) / sizeof(str[0]); i++)
    {
        strcpy (s, str[i]);
        printf("Original: %s", str[i]);
        printf("Reversed: %s", reverse(s));
    }
    return 0;
}

为什么会出现分段错误,我该如何解决?

【问题讨论】:

  • 首先使用调试器找出代码中发生崩溃的何处。然后检查所有相关变量的值。如果您仍然无法自己弄清楚,请编辑您的问题以告诉我们这些详细信息。
  • 是时候使用调试器了。对于这个小程序来说一点也不难。如果您对故障转储有任何具体问题,请更新详细信息。
  • 你的算法有点不对。

标签: c segmentation-fault


【解决方案1】:

问题是你的srcdst 指针在同一个方向移动,所以src 永远不会“抓住”dst。最终,指针越过了允许的内存区域,导致未定义的行为,从而导致分段错误。

您需要减少 dst 而不是增加它:

while (src < dst)
{
    tmp = *src;
    *src++ = *dst;
    *dst-- = tmp;
} //    ^^

Demo.

【讨论】:

    猜你喜欢
    • 2016-05-20
    • 1970-01-01
    • 2017-11-02
    • 1970-01-01
    • 2017-01-26
    • 1970-01-01
    • 2015-05-23
    相关资源
    最近更新 更多