无法在C中返回多维数组

无法在C中返回多维数组,c,arrays,multidimensional-array,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)*

我试图用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;
}
queue *digitsQArr = initQArr(length);
int digit = 0;
然而!当我调用这个函数并返回到一个新数组时,我得到了一个只有5个元素的数组:

queue* initQArr(int maxSize){
    queue arr[10];
    for (int i=0; i<10; i++) {
        arr[i]=createQueue(maxSize);
    }
    return arr;
}
queue *digitsQArr = initQArr(length);
int digit = 0;
(调试信息如下所示):


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

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

返回后,指针
arr
仍然有效,因为它指向堆上的内存。您应该
在使用后释放
这样的内存,就像
createQueue
中分配的队列指针一样,当函数initQArr完成执行时,您返回的数组超出了范围。您必须动态地将内存分配给“arr”并返回它。如果您想知道为什么会出现五个有效元素,则这与此直接相关。仅供参考,是恒星。或者将其声明为
static
。例如,
静态队列arr[10]
@itachi我试图将arr声明为
queue*arr=malloc(sizeof(struct queueRecord)*10)
,那么arr在函数中也只有5个元素。当我分配内存时,一定是出了什么问题…@itachi嘿,你是对的!它在动态地将内存分配给
arr
后工作。令人困惑的是,其中只有5个在XCODE的调试模式下显示。。。不管怎样,这个程序现在运行良好。谢谢但是当我使用
queue*arr=malloc(10*sizeof(*arr))
,我得到了一个
arr
,即使在函数
initQArr
中也只有5个有效元素,您如何检查这个?你会打印数组内容并得到奇怪的指针吗?“valid”元素是什么意思?它在我动态分配内存后工作!然而,当我在XCODE中调试时,调试窗口中只显示5个元素,这太奇怪了……我不熟悉XCODE或它的调试器,但是因为C数组不知道它们的大小,调试器也不能。在gdb(它似乎是Xcode支持的调试器之一)中,您必须打印
p*arr@10
,其中
@
后面的数字是要打印的条目数。
queue* initQArr(int maxSize){
    queue *arr = malloc(10 * sizeof(*arr));
    for (int i=0; i<10; i++) {
        arr[i]=createQueue(maxSize);
    }

    return arr;
}