realloc时,已有的和新插入的数据包含奇怪的值

When realloc, the existing and newly inserted data contain strange values

动态内存接受初始大小输入,然后在填满时自动增加,然后输入新数据。 如果检查数组中的值,则存在奇怪的值。

int main() {
    BOOK *books = NULL;
    int count = 0;
    int size = -1;
    menu(books, size, count);
    return 0;
}



void menu(BOOK *books, int size, int count) {

    printf("input initial size.\n");
    scanf("%d", &size);
    while (getchar() != '\n');
    books = allocArray(size);
    if (books == NULL) {
       return;
    }
    while (1) {
        printf("========menu========\n");
        printf("1. input book data\n");
        printf("2. books\n");
        int selector = -1;
        scanf("%d", &selector);
        switch (selector) {
            case 1:
                inputBook(books, &count, &size);
                break;
            case 2:
                showAllBooks(books, count);
                break;
            default:
                free(books);
                books = NULL;
                return;
        }
   }
}

void inputBook(BOOK *books, int *count, int *size) {
    if (*count == *size) {
        printf("--------realloc +5\n");
        *size = *size * 5;
        books = reAllocArray(books, *size);

    }
    printf("--------input--------\n");
    while (getchar() != '\n');
    printf("title :");
    scanf("%s", books[*count].title);

    printf("author :");
    scanf("%s", books[*count].author);

    printf("price :");
    scanf("%d", &books[*count].price);
    *count = *count + 1;

    }

BOOK *allocArray(int size) {
    BOOK *books = NULL;
    books = (BOOK *) malloc(sizeof(BOOK) * size);
    if (books == NULL) {
    printf("malloc fail\n");
    } else {
        memset(books, 0, sizeof(BOOK) * size);
    }
    return books;
}

BOOK *reAllocArray(BOOK *books, int size) {
    BOOK *temp = (BOOK *) realloc(books, sizeof(BOOK) * size);
    if (temp == NULL) {
    printf("realloc fail\n");
    }
    return temp;
}

void showAllBooks(BOOK *books, int count) {
    for (int i = 0; i < count; ++i) {
        printf("%d. title: %s author: %s proce: %d\n", i + 1, books[i].title, books[i].author, books[i].price);
    }
}

当初始大小设置为1时,则输入1,1,1个数据,并输入附加数据。 realloc 发生了,我输入了 2, 2, 2 如果检查数组,它包含 1,1,1 和 null,null 和 0.

如果之前输入了更多数据,现有数据也可能会损坏。

inputBook中,books的值可能会在函数内部更改为指向重新分配的内存块:

        books = reAllocArray(books, *size);

但是,这不会更改 menu 中相应的 books 变量,因为 C 中的函数参数是按值传递的。 (OP 必须已经意识到这一点,因为他们正在为 inputBook 的其他参数使用指针。)

为了与inputBook的其他参数保持一致,我建议将books参数的类型更改为BOOK **并更改menu以传递其地址books 变量与 countsize:

一样

(在menu):

                inputBook(&books, &count, &size);
void inputBook(BOOK **pbooks, int *count, int *size) {
    BOOK *books = *pbooks;
    if (*count == *size) {
        printf("--------realloc +5\n");
        *size = *size * 5;
        books = reAllocArray(books, *size);
        *pbooks = books;
    }
    printf("--------input--------\n");
    while (getchar() != '\n');
    printf("title :");
    scanf("%s", books[*count].title);

    printf("author :");
    scanf("%s", books[*count].author);

    printf("price :");
    scanf("%d", &books[*count].price);
    *count = *count + 1;

    }