c - 无法在 C 中返回多维数组

标签 c arrays multidimensional-array

我正在尝试用 C 编写一个函数,它返回指向数组的指针。这个数组的每个元素都是一个指向初始化结构的指针,在每个结构中还有一个指向数组的指针。

struct queueRecord;
typedef struct queueRecord* queue;

queue createQueue(int maxSize){
    queue newQueue = malloc(sizeof(struct queueRecord));
    newQueue->array = malloc(sizeof(int)*maxSize);
    newQueue->capacity=maxSize;
    newQueue->front=0;
    newQueue->rear=0;
    return newQueue;
}

这在以下函数中工作得很好:

queue* initQArr(int maxSize){
    queue arr[10];
    for (int i=0; i<10; i++) {
        arr[i]=createQueue(maxSize);
    }
    return arr;
}

当我在其中传递参数 10 并在返回时设置断点时,一切似乎都很好 (不好意思我发不了图,调试信息如下):

arr(queue[10])
 [0]=(queue)0x100105480
   capacity=(int)10
   size=(int)0
   front=(int)0
   rear=(int)0
   array=(int*)0x1001054a0
 [1]=(queue)0x1001054d0
 ...
 ...
 [9]=(queue)0x100105760

但是!当我调用这个函数并返回一个新数组时,我得到一个只有 5 个元素的数组:

queue *digitsQArr = initQArr(length);
int digit = 0;

(调试信息如下):

digitQArr = (queue*)0x7fff5fbff6d0
    *digitsArr=(queue)0x100105480
        capacity=(int)10
        size=(int)0
        front=(int)0
        rear=(int)0
        array=(int*)0x1001054a0
    [1]=(queue)0x1001054d0
    ...
    ...
    [4]=(queue)0x1001055d0

最佳答案

initQArr中,你返回一个局部变量的地址,arr:

queue* initQArr(int maxSize){
    queue arr[10];
    for (int i=0; i<10; i++) {
        arr[i]=createQueue(maxSize);
    }
    return arr;
}

返回的指针将指向局部数组arr,一旦函数返回,该数组就不再有效。您可以按照 createQueue 的示例在堆上分配内存:

queue* initQArr(int maxSize){
    queue *arr = malloc(10 * sizeof(*arr));
    for (int i=0; i<10; i++) {
        arr[i]=createQueue(maxSize);
    }

    return arr;
}

返回后,指针arr仍然有效,因为它指向的是堆上的内存。你应该在使用它之后释放这样的内存,就像在createQueue中分配的队列指针。

关于c - 无法在 C 中返回多维数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29927259/

相关文章:

php - 按最高值对 n 个项目进行多维自定义排序

cuda - 如何使用 make_cudaExtent 正确定义 cudaExtent?

c# - 混合起来,然后再次重新排序 .Net 2.0 中的数组

c - printf 是如何处理这个 char** 参数的?

c++ - 重定向和调用 fopen() 后没有串行输出

c - 从进程内部查找映射的内存

java - VetoSet NullPointerException

c++ - 将 3D 指针数组传递给函数

string - Delphi 2007 中对多维数组进行排序

c++ - 具有轻型用户数据和引用的 Lua 注册表有什么区别?