C 错误分段故障(堆芯转储)
我正在为我的大学课程做一些关于C的练习,我有以下代码,在用户输入选项(1或2)后,该代码以错误分段错误(内核转储)的形式存在。 我不知道这是否是一个问题,我正在使用ubuntu 16.04,并且我正在使用make命令编译我的源代码文件。 哦,请不要建议使用内置的c函数strcpy,因为这个练习应该“教我们”如何制作自己的字符串副本 那么我做错了什么C 错误分段故障(堆芯转储),c,c-strings,strcpy,C,C Strings,Strcpy,我正在为我的大学课程做一些关于C的练习,我有以下代码,在用户输入选项(1或2)后,该代码以错误分段错误(内核转储)的形式存在。 我不知道这是否是一个问题,我正在使用ubuntu 16.04,并且我正在使用make命令编译我的源代码文件。 哦,请不要建议使用内置的c函数strcpy,因为这个练习应该“教我们”如何制作自己的字符串副本 那么我做错了什么 #include <stdio.h> #define SIZE 1000 char mystrcpy(char *dest,char
#include <stdio.h>
#define SIZE 1000
char mystrcpy(char *dest,char *src);
main(){
char str1[SIZE];
char str2[SIZE];
char str3[SIZE];
int choice;
printf("Give first string: ");
gets(str1);
printf("Give second string: ");
gets(str2);
printf("Choose one of two strings (1 h 2): ");
scanf("%d",&choice);
if (choice==1)
mystrcpy(str3,str1);
else (choice==2)
mystrcpy(str3,str2);
printf("\nFirst string is %s\n",str1);
printf("\Second string is %s\n",str2);
printf("\nThrid string is %s\n",str3);
}
char mystrcpy(char *dest,char *src){
int i;
while(1)
{
dest[i] = src[i];
if (src[i] == '\0')
break;
i++;
}
return dest;
}
#包括
#定义大小1000
char mystrcpy(char*dest,char*src);
main(){
字符str1[大小];
字符str2[大小];
字符str3[大小];
智力选择;
printf(“给出第一个字符串:”);
获取(str1);
printf(“给出第二个字符串:”);
获取(str2);
printf(“从两个字符串中选择一个(1 h 2):”;
scanf(“%d”,选择(&C);
如果(选项==1)
mystrcpy(str3,str1);
其他(选项==2)
mystrcpy(str3,str2);
printf(“\n第一个字符串是%s\n”,str1);
printf(“\第二个字符串是%s\n”,str2);
printf(“\n字符串为%s\n”,str3);
}
char mystrcpy(char*dest,char*src){
int i;
而(1)
{
dest[i]=src[i];
如果(src[i]='\0')
打破
i++;
}
返回目的地;
}
i
从未初始化过。(需要30个字符)i
从未初始化过。(需要30个字符)您没有初始化i
,因此它从一个不确定的值开始,因此出现segfault
请注意,在这种简单的情况下,启用警告会立即显示此问题;在更复杂的情况下,使用调试器会显示崩溃时
i
的值完全没有意义。您没有初始化i
,因此它从一个不确定的值h开始这是一个断层
请注意,在这种简单的情况下,启用警告会立即显示此问题;在更复杂的情况下,使用调试器会显示崩溃时
i
的值完全没有意义。使用所有警告和调试信息编译(gcc-Wall-Wextra-g
)。改进您的代码以不获取任何警告。然后使用调试器(gdb
)^^^^^^巴兹尔说的话。这也会给您一个警告,说明else(choice==2)
没有任何意义。(尽管这不是SEGD故障的原因。)谢谢!就是这样!我在看教程的一部分。这个家伙从来没有初始化过我…仍然在他身上工作!干什么!再次感谢!这说明了教程的质量…远离它!使用所有警告和调试信息(gcc-Wall-Wextra-g
)编译。改进代码以不获得警告。然后使用调试器(gdb
)^^^^^巴兹尔说的话。这也会给你一个警告,else(choice==2)
没有任何意义。(虽然这不是故障的原因。)谢谢!就这样!我在看教程的一部分。这个家伙从来没有初始化过我…仍然在他身上工作!什么!再次感谢!这说明了教程的质量…远离它!