通过传递给函数来更改数组的元素

时间:2018-10-25 06:39:16

标签: c arrays element pass-by-reference

我试图通过引用传递数组,并在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;
    }
}

我知道也有类似的帖子,但是我所看到的所有帖子似乎都无法解决我的问题,感谢您的帮助!

4 个答案:

答案 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;
    }
}