我试图通过引用传递数组,并在changeArray()中更改数组中的值。我收到一条错误消息,指出“访问冲突写入位置0x00000001。”我读了Changing array inside function in C,并使用Ryyker的答案达到了预期的结果(使x [] = {1,1,1,1,1]),但出现上述错误。这是我的代码:
#include <stdio.h>
#include <stdlib.h>
int changeArray(int **a);
int main(void) {
int *x[5] = { 1,5,4,3,1 };
int *y[5] = { 1,5,4,3,1 };
changeArray(&x);
for (int z = 0; z <= 4; ++z) {
printf_s("%s", x[z]);
}
free(x);
}
int changeArray(int **a) {
for (int z = 0; z < 5; ++z) {
(*a)[z] = 1;
}
}
我知道也有类似的帖子,但是我所看到的所有帖子似乎都无法解决我的问题,感谢您的帮助!
答案 0 :(得分:3)
您的程序正在做完全不想要的事情。
int *x[5] = { 1,5,4,3,1 };
int *y[5]= { 1,5,4,3,1 };
在这里,您正在初始化一堆int pointers ,它们的值从1到5。因此它们指向无效的内存。
然后在这里:
for (int z = 0; z <= 4; ++z) {
printf_s("%s", x[z]);
}
您告诉它在无效的内存中打印字符串。
0x00000001
中的Access violation writing location 0x00000001
实际上是1
中第一个int *x[5] = { 1,5,4,3,1 };
的十六进制表示。
您可能想要的是这样:
int changeArray(int *a) {
for (int z = 0; z < 5; ++z) {
a[z] = 1;
}
}
这:
int main(void) {
int x[5] = { 1,5,4,3,1 };
changeArray(x);
for (int z = 0; z <= 4; ++z) {
printf("%d", x[z]); // also consider adding space, such as "%d "
}
}
答案 1 :(得分:1)
int *x[5]
应该是int x[5]
。int y[5]
。int changeArray(int **a)
应该是void changeArray(int (*a)[5])
。free(x);
是
错误的,x
在堆栈中,不能释放。printf_s("%s", x[z]);
应该是printf("%d ", x[z]);
,x[z]
是int
,因此它需要%d
作为格式说明符。还要注意它后面的空格,以查看不同的数字,而不只是一个大的数字。这是您的更正代码https://ideone.com/kwXrFg
答案 2 :(得分:1)
代码应如下所示:
#include <stdio.h>
#include <stdlib.h>
void changeArray(int (*a)[5]);
int main(void) {
int x[5] = { 1,5,4,3,1 };
changeArray(&x);
for (int z = 0; z <= 4; ++z) {
printf_s("%d", x[z]);
}
return 0;
}
void changeArray(int (*a)[5]) {
for (int z = 0; z < 5; ++z) {
(*a)[z] = 1;
}
}
并给出输出:
11111
如您在 Live Demo 中看到的。
这是我所做的更改:
int *x[5] = { 1,5,4,3,1 };
更改为int x[5] = { 1,5,4,3,1 };
。y
,因为您不使用它。void changeArray(int
(*a)[5]);
,因为您什么都不返回,并且参数为
也进行了更改,即按原样通过数组x
。%d
来打印整数,而不是%s
。free(x)
,因为您没有为数组动态分配内存
x
,因此您不能手动取消分配。答案 3 :(得分:0)
#include <stdio.h>
#include <stdlib.h>
int changeArray(int *a);
int main(void) {
int x[5] = { 1,5,4,3,1 };
int y[5]= { 1,5,4,3,1 };
changeArray(x);
for (int z = 0; z <= 4; ++z) {
printf_s("%s", x[z]);
}
}
int changeArray(int *a) {
for (int z = 0; z < 5; ++z) {
a[z] = 1;
}
}