为C中的二维数组重新分配内存
Reallocating memory for a two dimensional array in C
我的目标是在 C 中为二维 int 数组动态重新分配内存。我知道已经有几个关于该主题的问题,但不幸的是我的代码没有 运行 正确而且我不知道出了什么问题。
首先我分配内存:
int n = 10;
int m = 4;
int** twoDimArray;
twoDimArray = (int**)malloc(n * sizeof(int*));
for(int i = 0; i < n; i++) {
twoDimArray[i] = (int*)malloc(m * sizeof(int));
}
并用整数初始化数组:
for(int i = 0; i < n; i++) {
for(j = 0; j < 4; j++) {
twoDimArray[i][j] = i * j;
}
}
然后我使用realloc()
动态重新分配内存:
int plus = 10;
int newArraySize = n + plus;
twoDimArray = (int**)realloc(twoDimArray, newArraySize * sizeof(int));
我希望我的数组 twoDimArray
现在可以在 [10][0] 访问,但是当 运行ning
printf("twoDimArray[10][0] = %d\n", twoDimArray[10][0]);
我收到 "EXC_BAD_ACCESS" 运行时间错误。
可能我遗漏了一些相当简单的东西,但由于我是 C 语言的新手,无法找出我的错误。感谢任何帮助。
重新分配指针数组是必要的,但是您只有 n
个指向有效值的值。您需要分配其余的子数组,因为新分配的内存指向 unallocated/invalid 区域。错误不是来自访问指针,而是来自取消引用它。
您需要添加如下内容:
for(int i = n; i < n+plus; i++) {
twoDimArray[i] = malloc(m * sizeof(int));
}
(解除分配也是如此:首先在循环中解除分配数组,然后解除分配指针数组)
旁白:
- 如果
realloc
returns NULL
,将 realloc
的结果直接分配给原始变量可能会出现问题。即使在那些调整大小的情况下很少见 (Under what circumstances can malloc return NULL?),您也应该将结果复制到临时变量中,检查 NULL
,如果重新分配失败,则 free
旧指针。
- Do I cast the result of malloc?
我的目标是在 C 中为二维 int 数组动态重新分配内存。我知道已经有几个关于该主题的问题,但不幸的是我的代码没有 运行 正确而且我不知道出了什么问题。
首先我分配内存:
int n = 10;
int m = 4;
int** twoDimArray;
twoDimArray = (int**)malloc(n * sizeof(int*));
for(int i = 0; i < n; i++) {
twoDimArray[i] = (int*)malloc(m * sizeof(int));
}
并用整数初始化数组:
for(int i = 0; i < n; i++) {
for(j = 0; j < 4; j++) {
twoDimArray[i][j] = i * j;
}
}
然后我使用realloc()
动态重新分配内存:
int plus = 10;
int newArraySize = n + plus;
twoDimArray = (int**)realloc(twoDimArray, newArraySize * sizeof(int));
我希望我的数组 twoDimArray
现在可以在 [10][0] 访问,但是当 运行ning
printf("twoDimArray[10][0] = %d\n", twoDimArray[10][0]);
我收到 "EXC_BAD_ACCESS" 运行时间错误。
可能我遗漏了一些相当简单的东西,但由于我是 C 语言的新手,无法找出我的错误。感谢任何帮助。
重新分配指针数组是必要的,但是您只有 n
个指向有效值的值。您需要分配其余的子数组,因为新分配的内存指向 unallocated/invalid 区域。错误不是来自访问指针,而是来自取消引用它。
您需要添加如下内容:
for(int i = n; i < n+plus; i++) {
twoDimArray[i] = malloc(m * sizeof(int));
}
(解除分配也是如此:首先在循环中解除分配数组,然后解除分配指针数组)
旁白:
- 如果
realloc
returnsNULL
,将realloc
的结果直接分配给原始变量可能会出现问题。即使在那些调整大小的情况下很少见 (Under what circumstances can malloc return NULL?),您也应该将结果复制到临时变量中,检查NULL
,如果重新分配失败,则free
旧指针。 - Do I cast the result of malloc?