如何更改函数中的int数组

Pop*_*oko 4 c arrays 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;
}
Run Code Online (Sandbox Code Playgroud)

输出是:

200 and 100
200 and 0
Run Code Online (Sandbox Code Playgroud)

代替:

200 and 100
200 and 100
Run Code Online (Sandbox Code Playgroud)

Dan*_*her 11

版本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;

}
Run Code Online (Sandbox Code Playgroud)

不是将指针传递给数组,而是将指针传递给数组的第一个元素.

版本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;

}
Run Code Online (Sandbox Code Playgroud)

使用括号来补偿优先级.

您的代码中的问题是

*vals2[1]
Run Code Online (Sandbox Code Playgroud)

*(vals2[1]),因此它Values在传递的指针之后取消引用指针的一个单位.您没有分配可访问的内存,因此它是未定义的行为.实际上,它与访问相同

arr[1][0]
Run Code Online (Sandbox Code Playgroud)

int arr[2][MAX];
Run Code Online (Sandbox Code Playgroud)

但是你vals只是(相当于)一个int arr[1][MAX];,所以你正在访问越界.但是,如果更糟糕的事情发生,*vals2[1] = 100;changeArrvals[MAX]main,以100,可能会覆盖一些至关重要的,虽然.

int changeArr(Values *vals2)您传递指向MAX ints 数组的指针时,请将第一个此类数组转换为数组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
Run Code Online (Sandbox Code Playgroud)

changeArr,指针vals2指向数组vals.因为它是一个指向a的指针int[MAX],vals2+1指向一个起始后的字节int[MAX]偏移量(刚好在结尾之后).,或等效地,就是刚刚之后的那个数组(它不存在).MAX*sizeof(int)valsvalsvals2[1]*(vals2 + 1)vals

您希望更改vals[1]位于数组中vals2[0]1*sizeof(int)字节偏移量,因此您需要vals2[0][1]或等效(*vals2)[1].