我尝试在我的功能中执行以下操作但仍然遇到分段错误错误。当我尝试使用[iModify - 1]
作为我的索引时,它失败了。
你能不能将int变量计算用作C?
中的索引int modify(pb *PhoneBook)
{
int x;
int iModify = 0;
char name_num[] = {'\0'};
print(PhoneBook);
printf("\nWhich entry would you like to modify? ");
scanf("%d", &iModify);
printf("\niModify - 1: %d\n", iModify - 1);
printf("\nModify name or number? ");
scanf("%s", name_num);
convert_u(name_num);
if (strcmp(name_num, "NAME") == 0) {
printf("\nEnter new name: ");
scanf("%s %s", PhoneBook[iModify - 1].cFirstName, PhoneBook[iModify - 1].cLastName); //fails here
}
else if (strcmp(name_num, "NUMBER") == 0) {
printf("\nEnter new number: ");
scanf("%s", PhoneBook[iModify - 1].cNumber); //also fails here
}
}
答案 0 :(得分:5)
这里的问题是
char name_num[] = {'\0'};
此处,name_num
的长度为1 char
,这不足以在以后持有字符串。所以,当你做的时候
scanf("%s", name_num);
你实际上是在写出界限,调用undefined behavior。
参考:C11
,章节§6.7.9
如果初始化未知大小的数组,则其大小由索引最大的数组决定 具有显式初始化程序的元素。 [...]
要与您的代码进行比较,name_num
是一个未知大小的数组,仅由括号括起初始值设定项中的单个元素初始化,因此数组的大小将为1.
解决方案:您必须在定义时明确提及大小。你需要像
这样的东西char name_num[32] = {'\0'}; //32 is just for example purpose
....
scanf("%31s", name_num); // make sure longer inputs don't blow up the buffer
或类似。
话虽如此,请注意您的int modify()
函数不 return
任何值。如果在调用者中使用了返回的值,它将再次调用undefined behavior。
答案 1 :(得分:0)
您在代码中使用了char name_num[] = {'\0'};
。 name_num
的长度为1 char
,此时间太短,无法在以后保留字符串。
因此,当您阅读name_num
时,您正在写出越界。