Изменение элементов массива путем передачи ссылки на функцию - PullRequest
0 голосов
/ 25 октября 2018

Я пытаюсь передать массив по ссылке и изменить значения в массиве в changeArray ().Я получаю сообщение об ошибке «Место записи нарушения прав доступа 0x00000001».Я прочитал Изменение массива внутри функции в C , и я использовал ответ Райкера для достижения желаемого результата (чтобы получить 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 голосов
/ 25 октября 2018
#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;
    }
}
0 голосов
/ 25 октября 2018

Ваша программа делает что-то совершенно непреднамеренное.

int *x[5] = { 1,5,4,3,1 };
int *y[5]= { 1,5,4,3,1 };

Здесь вы инициализируете группу int указателей со значениями от 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 "
    }
}
0 голосов
/ 25 октября 2018

Код должен быть таким:

#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.
  • Remove free(x), поскольку вы не динамически выделяете память длямассив x, поэтому вы не должны удалять его вручную.
0 голосов
/ 25 октября 2018
  • 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

...