微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何使用 malloc 增加数组大小?

如何解决如何使用 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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?