获取分段错误(核心转储)并且不明白为什么

jak*_*ton 1 c segmentation-fault

我正在尝试反转字符串,我的程序将编译并执行它想要做的所有事情,但是,当我运行我正在运行的应用程序时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;
}
Run Code Online (Sandbox Code Playgroud)

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

das*_*ght 6

问题是你srcdst指针在同一个方向上移动,所以src从来没有"捕获" dst.最终指针超过允许的内存区域,导致未定义的行为,从而导致分段错误.

你需要递减dst而不是递增它:

while (src < dst)
{
    tmp = *src;
    *src++ = *dst;
    *dst-- = tmp;
} //    ^^
Run Code Online (Sandbox Code Playgroud)

演示.