我正在尝试反转字符串,我的程序将编译并执行它应该执行的所有操作,但是,当我运行该应用程序时,我遇到了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;
}
为什么会出现段错误,我该如何解决?
最佳答案
问题是你的 src
和 dst
指针在同一个方向移动,所以 src
永远不会“ catch ” dst
。最终指针越过允许的内存区域,导致未定义的行为,从而导致段错误。
您需要减少 dst
而不是增加它:
while (src < dst)
{
tmp = *src;
*src++ = *dst;
*dst-- = tmp;
} // ^^
关于c - 获取段错误(核心转储)并且不明白为什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43207162/