在C中返回一个数组

时间:2014-02-16 09:36:08

标签: c arrays function

嗨,我是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数组+在程序结束时取消分配内存。即使我看过类似的话题,我也不知道如何解决它。

谢谢大家的帮助。我现在明白了。

2 个答案:

答案 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]);
    }
}