Целочисленный двойной указатель в параметре функции - PullRequest
0 голосов
/ 21 октября 2018

То, что я до сих пор узнал об указателях: указатель ссылается на адрес переменной

int a = 0 ;
int *p = &a ;

, а двойной указатель ссылается на адрес переменной указателя

int *b = &a ;
int **c = &b ;

и, насколько я знаю, верно, у меня не должно возникнуть проблем при выполнении приведенных ниже кодов:

#include<stdio.h>

void reference(int **input)
{
    **input = 963;
}

int main(void)
{
    int* value;

    reference(&value);

    printf("%d\n", *value);

    system("PAUSE");
    return 0;
}

В этом коде я ожидал увидеть "963" в консоли.Когда я выполняю код, сборка завершается успешно, но cmd просто останавливается.В чем может быть проблема для этого простого кода?

Ответы [ 2 ]

0 голосов
/ 21 октября 2018

Мы можем переписать

int* value;
reference(&value);

без функции, давая

int* value;
int **input = &value;
**input = 963;

Поскольку *input равно value, все это эквивалентно

int* value;
*value = 963;

Это неправильно, потому что value неинициализирован.Разыменование неинициализированного указателя имеет неопределенное поведение.

Исправлено:

int x;
int *value = &x;
reference(&value);

Т.е. сделать value точкой где-то, где 963 может быть сохранено.

0 голосов
/ 21 октября 2018

Проблема в том, что value - это указатель, который ни на что не указывает, он болтается.Сначала нужно установить его.

int foo;
int* value;
value = &foo;

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...