Ошибка сегментации, когда я передаю указатель на функцию - PullRequest
0 голосов
/ 08 октября 2019

так что я довольно плохо знаком с C и немного растерялся. У меня есть массив целых без знака, и у меня есть функция, которая меняет порядок массива с помощью указателей. в функции я передаю 2 указателя, один для начала массива и один для конца массива, например так:

void swapedints(unsigned int *x, unsigned int *y) {
    while (x != y) {
        *x ^= *y;
        *y ^= *x;
        *x ^= *y;
        x++;
        y--;
    }
}

Когда я вызываю функцию в моей главной строке, указатель стартера определяется как: &unsignedArray и для конца массива, который я использовал: endArray = (unsigned int *)(&unsignedArray +1) -1

Когда я передаю это функции, я получаю ошибку сегментации, кто-нибудь может объяснить, почему?

Обновление с правильным решением:

    void swapedints(unsigned int *x, unsigned int *y) {
while (x < y) {
    *x ^= *y;
    *y ^= *x;
    *x ^= *y;
    x++;
    y--;
 }
}

startPointer = unSignedarray endPointer = unSignedArray + длина массива -1

1 Ответ

1 голос
/ 08 октября 2019

Вероятно, это связано с тем, как вы пишете свой цикл. Ваше условие остановки x != y. Если массив имеет четное количество элементов, это никогда не будет истинным.

Если вы на 100% уверены, что оба указателя будут указывать на элементы в вашем массиве, вы можете сделать это следующим образом:

void swapedints(unsigned int *x, unsigned int *y) {
    while (x < y) {
        *x ^= *y;
        *y ^= *x;
        *x ^= *y;
        x++;
        y--;
    }
}

Важно убедиться, что оба параметра x и y указывают на элементы вашего массива. В противном случае ваша программа может не работать странным образом . Например, условие x < y всегда может быть истинным, даже если они указывают на совершенно разные вещи.

Я также очень подозрительно отношусь к вашему примеру для вычисления конца массива. Эта арифметика, которую вы показали нам, имеет мало смысла. Вероятно, вам следует использовать эту функцию следующим образом:

int main(void)
{
    int array[6] = {1, 2, 3, 4, 5, 6};
    swapedints(array, array + 5);
    // print the array
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...