C语言 为接收结构的函数分配适当的内存

utugiqy6  于 2023-02-03  发布在  其他
关注(0)|答案(2)|浏览(169)

我试图创建一个动态数据库,我可以修改它的大小,这是我写的代码,我把product char指针赋值给null,price赋值给-1,我希望它已经创建了数据库,让我继续创建新的数据库,用新的大小替换旧的数据库,但到目前为止,它只返回内存方向,并停止程序。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

typedef struct _product_t {
    char *product;
    float price;
} product_t;

product_t *newDatabase(product_t *database, int *dbSize, int newSize) {
    free(database);
    product_t *newdatabase = (product_t*)malloc(sizeof(database)*newSize);
    newdatabase->product = (char*)malloc(sizeof(char)*20);
    newdatabase->product = NULL;
    newdatabase->price = -1;
    free(newdatabase->product);
    return newdatabase;
}
int main(void) {
    product_t *database = NULL;
    int dbSize = 0;
    char cmd;
    do{
        printf("Command?");
        scanf(" %c", &cmd);
        switch (cmd) {

        case 'q':
            printf("Bye!");
            break;
        case 'n':
            printf("Size? ");
            int newSize2 = 0;
            scanf("%d", newSize2);
            newDatabase(database, &dbSize, newSize2);
            break;
        default:
            printf("Unkown command '%c'\n",cmd);
            }
    }while(cmd != 'q');
    return 0;

}
kmbjn2e3

kmbjn2e31#

使用realloc()可以更改分配的大小。数组的大小应该使用sizeof(*database),因为sizeof(database)只是指针的大小,而不是结构的大小。
初始化新数组元素时,需要一个循环。newdatabase指向数组的开头,而不是添加的新元素。

product_t *newDatabase(product_t *database, int *dbSize, int newSize) {
    // Free the old `product` pointers if we're shrinking
    for (int i = newSize; i < *dbSize; i++) {
        free(database[i].product);
    }
    product_t *newdatabase = realloc(database, sizeof(*database)*newSize);
    if (!newdatabase && newSize != 0) {
        printf("Unable to allocate memory\n");
        exit(1);
    }
    // initialize the new pointers if we're growing
    for (int i = *dbSize; i < newSize; i++) {
        newdatabase[i].product = malloc(sizeof(char)*20);
        newdatabase[i].price = -1;
    }
    *dbSize = newSize;
    return newdatabase;
}

您还需要修复要求输入大小的行:

scanf("%d", newSize2);

除了阅读字符串时,需要传递要写入的变量的地址,因此应该是:

scanf("%d", &newSize2);
mznpcxlj

mznpcxlj2#

最新的完全工作的版本,非常感谢大家的帮助!

#include <stdio.h>
            #include <string.h>
            #include <stdlib.h>

            typedef struct _product_t {
                char *product;
                float price;
            } product_t;

            product_t *newDatabase(product_t *database, int *dbSize, int newSize) {
                // Free the previous memory allocated for the database
                free(database);

                // Allocate new space for newSize products on the heap
                database = (product_t*) malloc(newSize * sizeof(product_t));

                // Initialize all products in the database with NULL and -1
                for (int i = 0; i < newSize; i++) {
                    database[i].product = NULL;
                    database[i].price = -1;
                }

                // Update the database size
                *dbSize = newSize;

                // Return the pointer to the new database
                return database;
            }
            int main(void) {
                product_t *database = NULL;
                int dbSize = 0;
                char cmd;
                do{
                    printf("Command?");
                    scanf(" %c", &cmd);
                    switch (cmd) {

                    case 'q':
                        printf("Bye!");

                        break;
                    case 'n':
                        printf("Size? ");
                        int newSize2 = 0;
                        scanf("%d", &newSize2);
                        if(newSize2 < 0) {
                            printf("Must be larger than 0");
                            break;
                        }
                        else{
                        database = newDatabase(database, &dbSize, newSize2);
                        break;
                        }
                    default:
                        printf("Unkown command '%c'\n",cmd);
                        }
                }while(cmd != 'q');
                return 0;

            }

通过大家的帮助找到了工作解决方案,谢谢

相关问题