我正在嘗試制作一個程式,該程式首先在另一個函式中創建一個陣列,回傳它,然后呼叫另一個對陣列內容進行混洗并回傳它的函式。但是,我在 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: %d\n", orgArr);
}
modArr = arrShuffle(orgArr);
}
uj5u.com熱心網友回復:
您不能使用具有自動存盤功能的變數(又名本地變數)。您必須分配陣列,以便函式結束后記憶體仍然有效:
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);
}
uj5u.com熱心網友回復:
正如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;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/314995.html
上一篇:為什么變數A沒有被復制到變數B?
