我正在尝试用 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/