为什么当我尝试 realloc() 结构指针数组时我的 C 程序崩溃?
Why does my C program crash when I try to realloc() a pointer array of structs?
在下面的代码中,我尝试使用 realloc() 扩展键值结构数组。
#include <stdio.h>
#include <string.h>
typedef struct {
char key[25];
char value[25];
} keyValPair;
void inputKeyVal(keyValPair* arr, int n) {
char inputKey[25];
char inputVal[25];
printf("input key: ");
scanf(" %24s", &inputKey);
printf("input value: ");
scanf(" %24s", &inputVal);
n++;
arr = (keyValPair*) realloc( (keyValPair*) arr, n*sizeof(keyValPair));
strcpy(arr[n-1].key, inputKey);
strcpy(arr[n-1].value, inputVal);
}
int main() {
keyValPair initArr[] = {{"foo", "bar"}, {"a", "b"}};
int n = sizeof(initArr)/sizeof(keyValPair);
keyValPair* arr = malloc(n * sizeof(keyValPair));
arr = initArr;
inputKeyVal(arr, n);
}
然而,每当我 运行 它时,它 运行 取决于输入提示,然后在 realloc() 尝试时崩溃。我仍然无法弄清楚为什么或如何解决它。对 C 相当陌生,因此非常感谢详细的解释,并且会有很长的路要走。
我认为存在三个问题
arr = initArr;
用initArr
覆盖arr
的地址,这样realloc
就不能拿malloc
分配的地址了。
为了保留malloc
分配的地址,initArr
的内容应该复制到arr
.
#include <stddef.h>
for (size_t i = 0; i < sizeof(initArr) / sizeof(initArr[0]); i++) {
arr[i] = initArr[i];
}
scanf
的最后一个参数是错误的。 &
是不必要的。
scanf("%24s", inputKey);
在 inputKeyVal
之后,main
的 arr
失去了有效地址,因为它在 inputKeyVal
中重新分配了。
如果您需要 realloc
重新分配的正确地址,inputKeyVal
应该 return 重新分配的地址。
keyValPair* inputKeyVal(keyValPair* arr, int n) {
/* snipped */
return arr;
}
int main() {
/* snipped */
arr = inputKeyVal(arr, n);
/* do something for arr */
free(arr);
return 0;
}
在下面的代码中,我尝试使用 realloc() 扩展键值结构数组。
#include <stdio.h>
#include <string.h>
typedef struct {
char key[25];
char value[25];
} keyValPair;
void inputKeyVal(keyValPair* arr, int n) {
char inputKey[25];
char inputVal[25];
printf("input key: ");
scanf(" %24s", &inputKey);
printf("input value: ");
scanf(" %24s", &inputVal);
n++;
arr = (keyValPair*) realloc( (keyValPair*) arr, n*sizeof(keyValPair));
strcpy(arr[n-1].key, inputKey);
strcpy(arr[n-1].value, inputVal);
}
int main() {
keyValPair initArr[] = {{"foo", "bar"}, {"a", "b"}};
int n = sizeof(initArr)/sizeof(keyValPair);
keyValPair* arr = malloc(n * sizeof(keyValPair));
arr = initArr;
inputKeyVal(arr, n);
}
然而,每当我 运行 它时,它 运行 取决于输入提示,然后在 realloc() 尝试时崩溃。我仍然无法弄清楚为什么或如何解决它。对 C 相当陌生,因此非常感谢详细的解释,并且会有很长的路要走。
我认为存在三个问题
arr = initArr;
用initArr
覆盖arr
的地址,这样realloc
就不能拿malloc
分配的地址了。
为了保留malloc
分配的地址,initArr
的内容应该复制到arr
.
#include <stddef.h>
for (size_t i = 0; i < sizeof(initArr) / sizeof(initArr[0]); i++) {
arr[i] = initArr[i];
}
scanf
的最后一个参数是错误的。 &
是不必要的。
scanf("%24s", inputKey);
在 inputKeyVal
之后,main
的 arr
失去了有效地址,因为它在 inputKeyVal
中重新分配了。
如果您需要 realloc
重新分配的正确地址,inputKeyVal
应该 return 重新分配的地址。
keyValPair* inputKeyVal(keyValPair* arr, int n) {
/* snipped */
return arr;
}
int main() {
/* snipped */
arr = inputKeyVal(arr, n);
/* do something for arr */
free(arr);
return 0;
}