C如何从多个函数返回数组?



我试图制作一个程序,首先在另一个函数中创建一个数组,返回它,然后调用另一个函数,打乱数组的内容并返回它。然而,我很难在C中做到这一点,因为我不太理解这里必须使用的数组指针系统。

到目前为止,我的代码没有从makeArray()返回值1-20,而是返回一个充满0的数组,我有一种感觉,它与c的数组指针系统有关。

任何帮助都将非常感激!提前谢谢你

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int arrShuffle();

int arrShuffle(int * arr) {
int arr[21];
// shuffle array
for(int j=0; j<20; j++) {
int randInd = (rand() % 20) + 1;
int temp = arr[j];
arr[j] = arr[randInd];
arr[randInd] = temp;
}
return arr;
}

int makeArray() {
int arr[21];
// make array of 1-20
for(int i=0; i < 20; i++) {
arr[i] = i + 1;
}
return arr;
}

void main() {
int *orgArr;
int *modArr;
srand(time(NULL));
orgArr = makeArray();
for(int i=0; i < 20; i++) {
printf("OrgArr: %dn", orgArr);
}
modArr = arrShuffle(orgArr);
}

不能使用自动存储变量(即本地变量)。您必须分配数组,以便在函数结束后内存仍然有效:

int* makeArray() {
int *arr = calloc(21, sizeof *a);
// make array of 1-20
for(int i=0; i < 20; i++) {
arr[i] = i + 1;
}
return arr;
}

当不再使用该数组时,请记住释放该数组:

int main() {
int *orgArr;
...
orgArr = makeArray();
...
free(orgArr);
}

正如tstanisl在他们的回答中指出的那样,一个可能的解决方案是使用动态内存分配。相反,我的答案将给您另一种解决方案:使用调用者传递的数组。

注意:两个解都是有效的,它们的有用性取决于你的程序的特定需求。没有什么"正确"通用的解决方案。

void makeArray(int arr[], size_t len) {
for (size_t i = 0; i < len; i += 1) {
arr[i] = (int) (i + 1);
}
}
void cloneAndModifyArray(const int orig[], int new[], size_t len) {
for (size_t i = 0; i < len; i += 1) {
new[i] = orig[i] * 2; // or some other modification
}
}

你可以这样使用:

#define ARR_LEN (100)
int main(void) {
int arr[ARR_LEN];
makeArray(arr, ARR_LEN);
int modified_arr[ARR_LEN];
cloneAndModifyArray(arr, modified_arr, ARR_LEN);
return 0;
}