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