如何解决如何使用 malloc 增加数组大小?
我尝试制作一个函数,在结构体数组中添加一个成员,然后增加其维度。
void addMember(id **list,size_t *size)
{
(*size)++;
*list = *size == 1 ? malloc(sizeof(id)) : realloc(*list,*size * sizeof(id));
if(!list) {
printf("Dynamic allocation Failed.\n");
exit(1);
}
list[*size-1]->name = malloc (30 * sizeof(char));
list[*size-1]->surname = malloc (30 * sizeof(char));
list[*size-1]->number = malloc (15 * sizeof(char));
if(!list[*size-1]->name || !list[*size-1]->surname || !list[*size-1]->number) {
printf("Dynamic allocation Failed.\n");
exit(1);
}
printf("Name: ");
fgets(list[*size-1]->name,30,stdin);
list[*size-1]->name[strcspn(list[*size-1]->name,"\n")] = 0;
list[*size-1]->name = realloc (list[*size-1]->name,strlen(list[*size-1]->name) + 1 * sizeof(char));
if(strcmp(list[*size-1]->name,"") == 0) {
printf("You did not enter the name. Try again.\n");
free(list[*size-1]->name);
(*size)--;
*list = realloc(*list,*size * sizeof(id));
return;
}
printf("Surname: ");
fgets(list[*size-1]->surname,stdin);
surname[*size-1]->surname[strcspn(list[*size-1]->surname,"\n")] = 0;
surname[*size-1]->surname = realloc (list[*size-1]->surname,strlen(list[*size-1]->surname) + 1 * sizeof(char));
if(strcmp(list[*size-1]->surname,"") == 0) {
printf("You did not enter the surname. Try again.\n");
free(list[*size-1]->surname);
(*size)--;
*list = realloc(*list,*size * sizeof(id));
return;
}
printf("Number: ");
fgets(list[*size-1]->number,15,stdin);
list[*size-1]->number[strcspn(list[*size-1]->number,"\n")] = 0;
list[*size-1]->number = realloc (list[*size-1]->number,strlen(list[*size-1]->number) + 1 * sizeof(char));
if(strcmp(list[*size-1]->number,"") == 0) {
printf("You did not enter the number. Try again.\n");
free(list[*size-1]->number);
(*size)--;
*list = realloc(*list,*size * sizeof(id));
return;
}
}
但是,当我尝试将第二个成员添加到数组时遇到了问题。事实上,在第二次调用期间,程序会在此处返回 EXC_BAD_ACCESS 错误:list[*size-1]->name = malloc (30 * sizeof(char));
。相反,我可以毫无问题地输入第一个数组成员。我该如何解决?结构是:
typedef struct {
char *name;
char *surname;
char *number;
} id;
编辑:
这是主文件:#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include "functions.h"
int main()
{
id *list = NULL;
size_t i,size = 0;
int choice;
srand((unsigned)time(NULL));
do {
printf("Enter '1' to display all members,enter '2' to add a new member,enter '3' to exit: ");
scanf("%d%*c",&choice);
putchar('\n');
switch(choice) {
case 1:
if(size == 0)
printf("There's no members.\n");
else
for(i = 0; i < size; i++)
printf("%s %s\n",list[i].name,list[i].surname);
break;
case 2:
if(size < 30)
addMember(&list,&size);
break;
}
printf("Press start.");
getchar(); putchar('\n');
} while(choice != 3);
free(list);
return 0;
}
解决方法
list
是指向 id
数组的指针,因此它应该是:(*list)[*size-1].name
等。您可以省去一些麻烦并创建一些临时变量以在函数中使用。在整个函数中使用它们,然后在函数的末尾将它们分配回来。
示例:
void addMember(id **list_original,size_t *size_original)
{
id *list = *list_original;
int size = *size_original;
size++;
list = size == 1 ? malloc(sizeof(id)) : realloc(list,size * sizeof(id));
if (!list) return; // Nothing to do as original values are untouched
list[size-1].name = malloc (30 * sizeof(char));
// etc...
*list_original = list;
*size_original = size;
}
另一种选择是将值包装在一个结构中并将指向该结构的指针传递给函数:
typedef struct {
id *list;
size_t size;
} list_data;
void addMember(list_data *list)
{
// If you pass NULL to realloc it acts like malloc
id *tmp = realloc(list->list,(list->size + 1) * sizeof(id));
if (!tmp) return;
list->list = tmp;
list->list[list->size].name = malloc(30);
// etc...
list->size += 1;
}
int main()
{
list_data list = {NULL,0};
addMember(&list);
// ....
}
旁注:在结果中使用传递给 realloc
的指针是不好的做法:
list = realloc(list,size * sizeof(id));
原因是如果 realloc
失败,则原始内存丢失。使用临时变量。
id *temp_list = realloc(list,size * sizeof(id));
if (temp_list) {
list = temp_list;
// Continue
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。