重新分配一个字符串数组
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,并且您可能会考虑重构以使用记录结构...
我正在尝试编写一个函数 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,并且您可能会考虑重构以使用记录结构...