重新分配一个字符串数组

Realloc a string array

我正在尝试编写一个函数 realloc 3 个数组,这些数组是使用 malloc 在 main 中创建的,但是每次我尝试 运行 该程序时,我都会收到错误消息并且程序停止工作。

在我尝试调试时,我尝试在 "realloc" 之后打印数组,看起来 realloc 已成功完成,但在我扫描到这些新记录后,当我要打印时,我得到了错误。

更正 1:按照建议更正了 scanf 行中的错误。一旦输入第一个新记录

,程序 运行s 就会出错

欢迎任何意见!

void addRecord(char** firstName,char** lastName, float* score, int * recordSize)
{
     int add,i;
     printf("How many records do you want to add? ");
     scanf("%d", &add);

     firstName = realloc(firstName, (*recordSize+add)*sizeof(char*));
     for (i=*recordSize; i<(*recordSize)+add; i++)
         firstName[i]= malloc(STRSIZE*sizeof(char));

     lastName = realloc(lastName, (*recordSize+add)*sizeof(char*));
     for (i=*recordSize; i<(*recordSize)+add; i++)
         lastName[i]= malloc(STRSIZE*sizeof(char));

     score = realloc(score, (*recordSize+add)*sizeof(float));
     printf("Please enter the record to be added: \n");
     printf("FirstName LastName Score\n");

    for (i=*recordSize; i<*recordSize+add; i++)
        scanf("%s %s %f", firstName[i], lastName[i], &score[i]);
    *recordSize +=add;
 }
scanf("%s %s %f", firstName[i], lastName[i], &score[i]);

您使用的是指向内存的指针。删除“&”,然后将指向您的内存的指针发送到 scanf()

您应该知道,如果指针地址发生变化,您的重新分配将不会在您的主函数中可见。您正在重新分配整个字符串数组,但此更改仅发生在 addRecord() 函数中。当你回到你的 main 函数时,你可能有一个 dangling pointer 因为 realloc() 可以 return 一个新的内存地址并释放原来的内存块。那就是 printf("%p\n", firstName); 可以在 addRecord()addRecord() return 之后的主函数中打印不同的东西。

例如:

#include <stdio.h>

/* Simulate the reallocation of bar by swapping oldbar and bar. */
void foo(int *bar)
{
    static int *oldbar = NULL;

    if (oldbar == NULL) {
        oldbar = bar;
        bar = NULL;
    } else {
        bar = oldbar;
        oldbar = NULL;
    }

    printf("bar after reallocating is: %p\n", (void *)bar);
}

/* Notice the extra * below and the dereferencing of the pointer, allowing
   main() to see the change. */
void foo_works(int **bar)
{
    static int *oldbar = NULL;

    if (oldbar == NULL) {
        oldbar = *bar;
        *bar = NULL;
    } else {
        *bar = oldbar;
        oldbar = NULL;
    }

    printf("bar after reallocating is: %p\n", (void *)bar);
}

int main(void)
{
    int bar[] = {1, 1, 2, 3, 5, 8};
    int *barptr = bar;

    printf("barptr before reallocating is: %p\n", (void *)barptr);
    foo(barptr);
    printf("barptr after reallocating is: %p\n\n", (void *)barptr);

    printf("barptr before reallocating is: %p\n", (void *)barptr);
    foo_works(&barptr);
    printf("barptr after reallocating is: %p\n", (void *)barptr);
}

对于一个字符串数组,你只需要像我在foo_works()的定义中那样在参数中添加另一个*并取消引用。这样你就有了一个指向数组的指针,它允许你的主函数看到变化。当然,这意味着您将成为 Three Star Programmer,并且您可能会考虑重构以使用记录结构...