我正在尝试用动态二维数组编写程序。我创建5个指针数组然后我想在5的选定数组上放置一个值,我需要重新分配,以便能够将另一个放在同一个数组中,但是我得到一个错误,我不知道如果这是正确的。有人可以帮助我。
#include <stdio.h>
#include <stdlib.h>
void putValue(int** array, int* size, int value, int n) {
if (n == 1) {
array[0][size[0] - 1] = value;
size[0]++;
array[0] = (int*)realloc(array, size[0] * sizeof(int));
} else if (n == 2) {
array[1][size[1] - 1] = value;
size[1]++;
array[1] = (int*)realloc(array, size[1] * sizeof(int));
} else if (n == 3) {
array[2][size[3] - 1] = value;
size[2]++;
array[2] = (int*)realloc(array, size[2] * sizeof(int));
} else if (n == 4) {
array[3][size[3] - 1] = value;
size[3]++;
array[3] = (int*)realloc(array, size[3] * sizeof(int));
} else if (n == 5) {
array[4][size[4] - 1] = value;
size[4]++;
array[4] = (int*)realloc(array, size[4] * sizeof(int));
}
}
int main(void) {
int** array;
int* size;
size = (int*)malloc(5 * sizeof(int));
for (int i = 0; i < 5; i++) {
size[i] = 1;
}
array = (int**)malloc(5 * sizeof(int*));
for (int i = 0; i < 5; i++) {
array[i] = (int*)malloc(1 * sizeof(int));
}
putValue(array, size, 5, 1);
for (int i = 0; i < 5; i++) {
for (int j = 0; j < size[i]; j++) {
printf("%d ", array[i][j]);
}
printf("\n");
}
for (int i = 0; i < 5; i++) {
free(array[i]);
}
free(array);
free(size);
return 0;
}
答案 0 :(得分:1)
你在错误的数组上使用realloc
,这个
array[0] = realloc(array, size[0] * sizeof(int));
应该是
array[0] = realloc(array[0], size[0] * sizeof(int));
此外,无需从void*
转换为任何内容,因为它隐含在C中,array = malloc(5 * sizeof(int*))
就足够了。
此外,您可以使用传递给putValue
函数的索引,而不是具有不同情况的索引,例如:
void putValue(int** array, int* size, int value, int n) {
--n;
array[n][size[n] - 1] = value;
size[n]++;
array[n] = realloc(array[n], size[n] * sizeof(int));
}
最后请注意,动态数组的语义通过大小比当前元素数量大而工作,这不精确,你应该从一个空数组开始并向它们添加元素。实际上,从一个1元素数组开始,在添加一个元素后最终大小为2.
答案 1 :(得分:0)
你有几个问题
您的putValue
函数不适用于n > 5
,它与DRY原则相矛盾,更好的写作方式是
void putValue(int** array, int* size, int value, int n) {
void *auxiliary;
--n;
auxiliary = realloc(array[n], (1 + size[n]) * sizeof(int));
if (auxiliary == NULL) {
fprintf(stderr, "out of memory\n");
return;
}
array[n] = auxiliary;
array[n][size[n]++] = value;
}
不需要malloc
的第一个array
循环,当realloc
的第一个参数为malloc
时,NULL
的行为与memset
相似所以malloc(5 * sizeof(int*))
检查memset(array, 0, 5 * sizeof(*array));
成功后就足够了
malloc
您应该检查调用realloc
或NULL
的结果。如果失败,则这些函数返回NULL
,如果指针为for (int i = 0; i < 5; i++) {
for (int j = 0; j < size[i]; j++) {
printf("%d ", array[i][j]);
}
printf("\n");
}
,则对指针的任何后续访问都是未定义的行为。
这个循环是错误的,因为你还没有初始化数组
int main(void) {
int** array;
int* size;
size = malloc(5 * sizeof(*size));
if (size == NULL) {
fprintf(stderr, "out of memory\n");
return -1;
}
memset(size, 0, 5 * sizeof(*size));
array = malloc(5 * sizeof(*array));
if (array == NULL) {
fprintf(stderr, "out of memory\n");
free(size);
return -1;
}
memset(array, 0, 5 * sizeof(*array));
/* initialize the arrays */
for (int i = 0 ; i < 5 ; ++i)
putValue(array, size, i, 1 + i);
/* print the arrays */
for (int i = 0; i < 5; i++) {
for (int j = 0; j < size[i]; j++) {
printf("%d ", array[i][j]);
}
printf("\n");
}
for (int i = 0; i < 5; i++) {
free(array[i]);
}
free(array);
free(size);
return 0;
}
访问未初始化的值,也是未定义的行为。
这是您修复的主要功能
{{1}}