Как назначить целое число указателю в c? - PullRequest
0 голосов
/ 04 сентября 2018

Задача - создать функцию

 int* pairSumSearch(int* data, int numEls, int pairSum)

, который ищет в первых numEls списка, если целые числа 'data', найти два смежных целых числа, которые суммируются с 'pairSum', и вернуть указатель на позицию первого из двух целых чисел. Если нет двух целых чисел, которые суммируют в pairum, то функция должна вернуть нулевой указатель. Я думаю, что у меня есть весь код, за исключением части указателей.

int* pairSumSearch(int* data, int numEls, int pairSum) 
{
    int* point = NULL;
    int checker = data[0];
    for (int i = 1; i < numEls-1; i++) {
        if (checker + data[i] == pairSum) {
            *point = i-1;
            break;
        } else {
            checker = data[i];
        }
    }
    return point;
}

Контрольный пример

int main(void)
{
    int data[] = {1, 2, 3, 4, 5, 6, 7, 10, 9, 10}; 
    int* p = pairSumSearch(data, 10, 19);
    if (p != NULL) {
        printf("Found at position %zd\n", p - data);
    }
    else {
        puts("Not found");
    }
}

но я просто получаю ошибки сегмента, где вместо этого он должен возвращать

Found at position 8

Ответы [ 3 ]

0 голосов
/ 04 сентября 2018

Ответ на вопрос, который вы задаете:

Как назначить целое число указателю в c

довольно просто. Вы не Указатель содержит адрес. Вы никогда не должны (хорошо, есть особые случаи, но вы еще не там) назначить целое число для указателя. Вы задаете не тот вопрос, потому что не хотите этого делать.

Что означает *point = i-1 - это изменить значение памяти по адресу point на i-1.

Как объяснил Мигель, *point = i-1 совершенно неверно и должно быть point = &data[i-1]. Кажется, вы пытаетесь вернуть индекс, но то, что вы должны вернуть указатель.

Я думаю, вы должны найти учебник по указателям. Есть много онлайн.

Найдено в позиции 8

Нет, он должен печатать Found at position 7, поскольку первый индекс равен нулю.

Ваш код немного грязный. Это намного чище.

int* pairSumSearch(int* data, int numEls, int pairSum)
{
    for (int i = 0; i < numEls-1; i++) {
        if (data[i] + data[i+1] == pairSum) {
            return &data[i];
        }
    }
    return NULL;
}
0 голосов
/ 05 сентября 2018

Ошибка в вашем коде в этой строке: *point = i-11;

Вы пытаетесь сохранить индекс (данные), а не адрес (указатель) в том месте, куда указывает point.

Дело в том, что вашей int * переменной point не выделено никакой памяти. Или, другими словами, ваш указатель никуда не указывает.

Либо вы прямо указываете на индекс массива data. например point = &(data[i-1]), тогда вы сможете вернуть адрес бывшего элемента пары, и ваш код будет работать нормально.

Вы получаете ошибку сегментации, потому что пытаетесь сохранить i-1 в месте, где нет памяти (или недостаточно памяти).

Хотя это будет семантически неправильно в соответствии с вашим методом тестирования, если вы хотите, чтобы этот оператор работал без генерации ошибки, вам следует выделить память для int *point. например int *point = (int *) malloc(sizeof(int));.

0 голосов
/ 04 сентября 2018

Я думаю

*point = i-1;

Должно быть

point = &data[i-1];

Без начального *.

...