这个程序的简化版本的任务是将字符串存储在数组中。如果给定名称的乘积已经被占用,我就不存储它,否则我就使用malloc为链分配空间。但是我遇到了一个分段错误,我找不到错误Completprogram https://onecompiler.com/c/3yqnk3e5s
struct product{
int *regal;
char *name;
}product;
struct product allocList(struct product **list, int *alloc)
{
*list = (struct product*) malloc(sizeof(struct product)*(*alloc));
(*list)->regal = calloc(100, sizeof(int));
}
int isInList(struct product **list, int *listSize, char *item, int *itemIndex)
{
for(int i=0; i< *listSize; i++)
if(! strcmp(item, list[i]->name))
{
(*itemIndex) = i;
return 1;
}
return 0;
}
int insert(struct product **list, int *alloc, int *listSize, char *item, int regalIndex)
{
int itemIndex = 0;
if(isInList(*(&list), *(&listSize), item, &itemIndex))
return 0;
list[(*listSize)]->name = (char*) malloc(sizeof(char)*(strlen(item)+1));
strcpy(list[(*listSize)]->name, item);
(*listSize)++;
return 1;
}
int main()
{
struct product *list = NULL; int listAlloc = 2000; int listSize = 0; allocList(&list, &listAlloc);
char *str = "abcd"; char *str1 = "bcd";
insert(&list, &listAlloc, &listSize, str, 1);
insert(&list, &listAlloc, &listSize, str, 1);
insert(&list, &listAlloc, &listSize, str1, 1);
return 0;
}
1条答案
按热度按时间lmyy7pcs1#
您的程序segfaults位于
insert()
的第一行,当您修复该错误时,会出现以下行:由于list是
struct product **list
类型,这意味着您要遵从list
之后的sizeof(list) * (*listSize)
元素中存储的任何数据,这在*listList > 0
时是未定义的行为。相反,您希望取消引用list,然后访问数组元素 *listSize。我建议您使用strdup()
而不是malloc()
+strcpy()
:下一步是引入一个结构体来保存列表实现的细节,并传递它而不是双指针。