I'm trying to do the below in my function but keep getting a segmentation fault error. It's failing when I'm trying to use [iModify - 1]
as my index.
Can you not use an int variable calculation as an index in 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
}
}
The problem here is
here,
name_num
is having a length of 1char
, which will not be sufficient for holding a string at a later point. So, when you doyou're essentially writing out of bound which invokes undefined behavior.
Reference:
C11
, chapter §6.7.9To compare with your code,
name_num
is an array of unknown size which is being initialized by only a single element in a brace enclosed initializer, so the size of the array will be 1.Solution: You have to mention the size explicitly at the time of definition. You'll be needing something like
or similar.
Having said that, please notice your
int modify()
function does notreturn
any value. If the returned value is used in the caller, it will again invoke undefined behavior.You have used
char name_num[] = {'\0'};
in your code.name_num
has the length of 1char
, which is too short to hold a string later.Therefore, you are writing out-of-bounds when you read
name_num
.