出于教育目的,我試圖使用陣列指標將兩個整數陣列與它們的記憶體位置交換,但我遇到了一些奇怪的問題,我不知道為什么會這樣,
因此,當我嘗試創建一個 int 陣列并使用下面的交換函式交換它們的位置時,它們的元素只有一半發生了變化,但是當我切換int fArr[size];到int *fArr = malloc(sizeof(int) * size);它時,它作業得很好。為什么會發生這種情況并且會&int[]導致int **問題?
int main(void) {
...
int fArr[size];
int sArr[size];
initArr(fArr, sArr, size);
...
swapArr((int **)&fArr, (int **)&sArr, size);
}
void initArr(int fArr[], int sArr[], size_t size) {
srand(time(NULL));
for (size_t i = 0; i < size; i ) {
fArr[i] = rand() % 1000;
sArr[i] = rand() % 1000;
}
}
void swapArr(int **fArr, int **sArr, size_t size) {
int *temp = *fArr;
*fArr = *sArr;
*sArr = temp;
}
這個完整代碼的輸出是
Array : 0x7ffcdb611cf0
521, 210, 426, 263
Array : 0x7ffcdb611ce0
553, 314, 17, 16
------- After Swap -------
Array : 0x7ffcdb611cf0
553, 314, 426, 263
Array : 0x7ffcdb611ce0
521, 210, 17, 16
uj5u.com熱心網友回復:
該函式swapArr交換 2 個指標的值。您傳遞int陣列的地址,不恰當地轉換為指向int *. 代碼具有未定義的行為。發生的事情是陣列的前 2 個條目被交換,因為int *在您的架構上恰好有 2 的大小int:例如int *,在 64 位 CPU 上有 8 個位元組,而int32 位型別占用 4 個位元組。
請注意,盡管有宣告語法,但引數initArrays確實是。當您將陣列作為函式引數(以及大多數其他運算式背景關系)傳遞時,它會衰減為指向其第一個元素的指標。int *void initArr(int fArr[], int sArr[], size_t size)
要交換陣列內容,您需要使用回圈:
void swapArr(int *fArr, int *sArr, size_t size) {
for (size_t i = 0; i < size; i ) {
int temp = fArr[i];
fArr[i] = sArr[i];
sArr[i] = temp;
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/514904.html
標籤:数组C指针交换
上一篇:如何對匯編中的兩個陣列元素求和?
