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

标签 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;
}

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

最佳答案

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

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

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

Demo.

关于c - 获取段错误(核心转储)并且不明白为什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43207162/

相关文章:

c - 在 GDB 中打印结构数组的变量值

c - 二叉树结构实现的问题

c - 在c中调用函数时出现段错误

c - Ruby C 扩展 : rb_funcall causing segfault

c++ - C++ 内置排序

c - SIGHUP 信号处理以在 Unix 系统编程中取消命令的操作

javascript - 在javascript中读取C程序的输出文件

c - malloc 成功还是失败?

c++ - 奇怪的分段违规

mysql_init(NULL) 段错误