嗨,我是C(和编程)中的新手,我正在尝试创建一个返回动态分配数组的函数。它看起来像:
int *returnArray(void)
{
int i, *p[4];
for (i = 0; i < 4; i++)
if ((p[i]=(int *)malloc(sizeof(int)*(4-i))) == NULL)
return NULL;
return &p[0][0];
}
并致电此功能:
int *ar;
if ((ar = returnArray()) == NULL) {
/* ERROR */
return 1;
}
但它根本不起作用。调用函数后我想使用* ar像普通的2D数组+在程序结束时取消分配内存。即使我看过类似的话题,我也不知道如何解决它。
谢谢大家的帮助。我现在明白了。
答案 0 :(得分:5)
你很亲密。您缺少的是您需要分配两个维度,如下所示:
int** CreateTwoDimensionalArray(int rows, int cols)
{
int row, prevrow;
int** result = (int**) calloc(rows, sizeof(int*));
if (result == NULL) {
return NULL;
}
for (row = 0; row < rows; ++row) {
int* current_row = (int*) calloc(cols, sizeof(int));
if (current_row == NULL) {
for (prevrow = 0; prevrow < row; ++prevrow) {
free(result[prevrow]);
}
free(result);
return NULL;
}
result[row] = current_row;
}
return result;
}
void FreeTwoDimensionalArray(int** array, int rows, int cols)
{
int row;
for (row = 0; row < rows; ++row) {
free(array[row]);
}
free(array);
}
答案 1 :(得分:0)
在函数returnArray
中,变量p
是一个局部变量,所以你不应该返回它的地址。
您可以返回其中的一个值(例如 - p[2]
),但您显然会丢失所有其他值。
因此,不是返回此数组,而是将其传递给函数并初始化其中的条目:
void initArray(int* p[])
{
int i;
for (i=0; i<SIZE; i++)
p[i] = (int*)malloc(sizeof(int)*(SIZE-i));
}
然后,您可以调用此函数并检查所有分配是否已成功完成:
int i;
int* p[SIZE];
initArray(p);
for (i=0; i<SIZE; i++)
{
if (p[i] == NULL)
break;
}
if (i < SIZE)
{
//Error - not all allocations have completed successfully
}
else
{
// Example #1
scanf("%d",&p[3][0]);
printf("%d",p[3][0]);
// Example #2
scanf("%d" , p[3]);
printf("%d",*p[3]);
}
当然,您需要在以后执行时释放已分配的内存:
void freeArray(int* p[])
{
int i;
for (i=0; i<SIZE; i++)
{
if (p[i])
free(p[i]);
}
}