我的問題很簡單,如果我必須在 C 中定義用戶大小的陣列中輸入資料,我應該使用指標來存盤它們還是陣列
#include <stdio.h>
#include <stdlib.h>
int main(){
int *arr, n, i;
printf("Enter number of elements: ");
scanf("%d", &n);
arr=(int *)malloc(n*sizeof(int));
printf("Enter number of elements:\n");
for(i=0; i<n; i )
scanf("%d", &arr[i]);
}
要么
#include <stdio.h>
#include <stdlib.h>
int main(){
int n, i;
printf("Enter number of elements: ");
scanf("%d", &n);
int arr[n];
printf("Enter number of elements:\n");
for(i=0; i<n; i )
scanf("%d", &arr[i]);
}
就我個人而言,我發現使用指標更舒服,但是由于 C 對陣列和指標的處理方式不同,我將來可能會遇到問題。
uj5u.com熱心網友回復:
提供的片段在語意上不匹配。使用“指標”的一個在堆上分配記憶體,malloc另一個將在堆疊上分配記憶體(alloca在引擎蓋下使用)。
此外,C 不會以不同的方式處理指標和陣列:
int a[10];
a[2] = 69;
在語意上等同于:
int* a = alloca(10 * sizeof(int));
*(a 2) = 69;
除了sizeof()運算子以及在將它們作為引數傳遞時有時如何處理它們之外,它們幾乎可以互換。
所以沒有真正的區別,你可以選擇你喜歡的。
而且因為您似乎不知道堆疊和堆之間的區別:
在堆疊上分配記憶體具有以下優點:
- 更快
- 更少的記憶體管理
但:
- 當您分配太多(?8kb)時可能會溢位堆疊
- 將保持分配狀態并占用系統資源,直到功能超出范圍
PS:即使在示例中使用free()時也應始終使用malloc()
uj5u.com熱心網友回復:
已暗示但未完全解釋的另一個巨大差異是這兩個陣列的使用壽命。
如果這是一個讀取檔案并從中回傳整數陣列的函式
int* ReadInts(){..}
malloc 一
int*ReadInts(){
int * result = malloc(....);
...
return result;
}
作業正常,但vla 沒有
int*ReadInts(){
int result[X];
...
return result;
}
您的編譯器可能會編譯它(可能帶有警告),但這是錯誤的代碼。result將在 ReadInts 回傳時釋放,所以這是未定義的行為
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/434175.html
