C对字符串使用malloc

hjzp0vay  于 2022-12-02  发布在  其他
关注(0)|答案(1)|浏览(118)

这个程序的简化版本的任务是将字符串存储在数组中。如果给定名称的乘积已经被占用,我就不存储它,否则我就使用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;
}
lmyy7pcs

lmyy7pcs1#

您的程序segfaults位于insert()的第一行,当您修复该错误时,会出现以下行:

list[(*listSize)]->name = (char*) malloc(sizeof(char)*(strlen(item)+1));
   strcpy(list[(*listSize)]->name, item);

由于list是struct product **list类型,这意味着您要遵从list之后的sizeof(list) * (*listSize)元素中存储的任何数据,这在*listList > 0时是未定义的行为。相反,您希望取消引用list,然后访问数组元素 *listSize。我建议您使用strdup()而不是malloc() + strcpy()

(*list)[*listSize].name = strdup(item);

下一步是引入一个结构体来保存列表实现的细节,并传递它而不是双指针。

相关问题