c语言 - 如何修复'segmentation fault (core dumped)'错误?



我的代码按预期工作,但最后会出现"分段错误(核心转储("错误。我在网上阅读,这意味着我正在尝试访问不应该访问的内存,但我不知道如何解决这个问题。该程序应该按照ASCII顺序对终端中给出的参数进行排序和打印。

这是代码:

#include<unistd.h>
int     c_strcmp(char *str1, char *str2)
{
int     i;
i = 0;
while (str1[i] || str2[i])
{
if (str1[i] > str2[i])
return (1);
if (str1[i] < str2[i])
return (-1);
i++;
}
return (0);
}
void    c_putstr(char *str)
{
int     i;
i = 0;
while (str[i])
{
write(1, &str[i], 1);
i++;
}
write(1, "n", 1);
}
int     main(int argc, char *argv[])
{
int     i;
char    *temp;
i = 1;
while (i < (argc - 1))
{
if (c_strcmp(argv[i], argv[i + 1]) > 0)
{
temp = argv[i];
argv[i] = argv[i + 1];
argv[i + 1] = temp;
i = 0;
}
i++;
}
i = 0;
while (i < argc)
{
i++;
c_putstr(argv[i]);
}
}

这是一项学校作业,我只能使用"写"功能。

以下是我得到的两个输出示例:

a2-r2-p8% ./a.out test2 test3 test1 test4 | cat -e
test1
test2
test3
test4
zsh: segmentation fault (core dumped)  ./a.out test2 test3 test1 test4 | 
zsh: done                              cat -e
a2-r2-p8% ./a.out abg b cdf abc z azz | cat -e
abc
abg
azz
b
cdf
z
zsh: segmentation fault (core dumped)  ./a.out abg b cdf abc z azz | 
zsh: done                              cat -e

因此,程序确实正确地排序和打印,但在最后还是会出错。有人知道我能做些什么来解决这个问题吗?

在最后一个循环中

i = 0;
while (i < argc)
{
i++;
c_putstr(argv[i]);
}

检查i,但在索引之前将其递增。这意味着最后处理的元素是sentinel值NULL,您将尝试在输出函数中取消引用该值。

因此,如果您不想报告可执行文件名,请向下移动i++;,并从1开始

i = 1;
while (i < argc)
{
c_putstr(argv[i]);
i++;
}

最新更新