簡體   English   中英

如何更改函數中的int數組

[英]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; changeArrmain 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM