我是 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 会将 vals[MAX] 中的 main 设置为 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]

关于c - 如何更改函数中的 int 数组,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14003626/

10-11 04:07