[英]How can I change an int array in a function
我是C語言的新手,嘗試使用其他函數更改我的主要函數的數組時遇到困難。 除了查看解決方案之外,我還想獲得完整的解釋,我的代碼有什么問題以及您的解決方案的解釋是什么。
好的,所以我進行了過多的測試和錯誤實驗,但未能成功解決問題。 最終這是我當前的代碼:
#include <stdio.h>
#define MAX 20
typedef int Values[MAX];
int changeArr(Values *vals2)
{
*vals2[0] = 200;
*vals2[1] = 100;
printf("%d and ", *vals2[0]);
printf("%d\n", *vals2[1]);
return 0;
}
int main (int argc, char *argv[])
{
Values vals;
changeArr(&vals);
printf("%d and ", vals[0]);
printf("%d\n", vals[1]);
return 0;
}
輸出為:
200 and 100
200 and 0
代替:
200 and 100
200 and 100
版本1:
#include <stdio.h>
#define MAX 20
typedef int Values[MAX];
int changeArr(int vals2[]) {
vals2[0] = 200;
vals2[1] = 100;
printf("%d and ", vals2[0]);
printf("%d\n", vals2[1]);
return 0;
}
int main (int argc, char *argv[]) {
Values vals;
changeArr(vals);
printf("%d and ", vals[0]);
printf("%d\n", vals[1]);
return 0;
}
而不是將指針傳遞給數組,而是將指針傳遞給數組的第一個元素。
版本2:
#include <stdio.h>
#define MAX 20
typedef int Values[MAX];
int changeArr(Values *vals2) {
(*vals2)[0] = 200;
(*vals2)[1] = 100;
printf("%d and ", (*vals2)[0]);
printf("%d\n", (*vals2)[1]);
return 0;
}
int main (int argc, char *argv[]) {
Values vals;
changeArr(&vals);
printf("%d and ", vals[0]);
printf("%d\n", vals[1]);
return 0;
}
使用括號來補償優先級。
您的代碼中的問題是
*vals2[1]
是*(vals2[1])
,因此它在傳遞的指針之后以Values
一個單位解引用指針。 您那里沒有分配可訪問的內存,因此它是未定義的行為。 實際上,它與訪問
arr[1][0]
為
int arr[2][MAX];
但是您的vals
只(相當於)的int arr[1][MAX];
,因此您無法訪問。 但是如果沒有更糟的情況發生, *vals2[1] = 100;
在changeArr
將main
vals[MAX]
設置為100。但是,它可能會覆蓋一些至關重要的內容。
在int changeArr(Values *vals2)
您傳遞了一個指向MAX
int
數組的指針,分別是Values
數組中的第一個此類數組。 然后vals2[1]
是該Values
數組中的第二個數組(此處不存在), *vals2[1] == vals2[1][0]
是第二個數組中的第一個int
。 您想要修改指向的內存塊中第一個(也是唯一一個)數組的元素,因此要訪問vals2[0][1]
或等效地(*vals2)[1]
。
照片:
vals2 vals2[1]
| |
v v
|vals[0]|vals[1]|...|vals[MAX-1]|x
在changeArr
,指針vals2
指向數組vals
。 由於它是一個指向int[MAX]
vals2+1
指向的int[MAX]
在一個偏移MAX*sizeof(int)
字節開始后vals
(它是僅次於的端vals
)。 vals2[1]
或等效的*(vals2 + 1)
是vals
之后的那個數組(不存在)。
您想要更改vals[1]
(位於數組vals2[0]
,其偏移量為1*sizeof(int)
個字節,因此您需要vals2[0][1]
或等效地(*vals2)[1]
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.