Просто вы можете узнать, что не так в ваших манипуляциях с указателем, используя флаги предупреждений вашего компилятора.
В Windows и в Visual Studio IDE используйте встроенный отладчик, чтобы увидеть ошибки кодирования.
В среде Linux на компиляторе GCC попробуйте скомпилировать исходный код (в моем случае t.c) с помощью этой команды
gcc -Wall t.c -o t
gcc выдает эти предупреждения
t.c:8:1: warning: return type defaults to ‘int’ [-Wimplicit-int]
func(int **y)
^
t.c: In function ‘func’:
t.c:11:8: warning: assignment makes pointer from integer without a cast [-Wint-conversion]
*y = 1;
^
t.c:12:1: warning: control reaches end of non-void function [-Wreturn-type]
}
Очевидно, что назначение *y = 1; неверно.
Спасибо Марку Беннингфилду за полезную ссылку на использование указателя на указатель
измените свой код на что-то вроде этого, чтобы решить вашу проблему
#include <stdio.h>
int *p = NULL;
void func(int **y)
{
*y = malloc(sizeof(int));
**y = 1;
}
int main()
{
func(&p);
printf("%d\n",*p);
}
Сначала для функции, которая не возвращает никакого значения, используйте void в качестве возвращаемого типа. Во-вторых, если мы попытаемся передать указатель на указатель функции в качестве аргумента, например, func(int **y), поскольку y может содержать адрес указателя, мы должны вызвать его с помощью func (&p). p — целочисленный указатель.
Наконец, рекомендуется не приводить результат malloc() к чему-то вроде
(int *)malloc(sizeof(int))
приведение результата malloc?
person
EsmaeelE
schedule
09.07.2017
*y = 1;присваивает 1 указателю. Конечно УБ. Вы хотели**y = 1? - person chux - Reinstate Monica   schedule 09.07.2017#includeдляstdio.hиstdlib.h- person user3629249   schedule 10.07.2017void*, поэтому его можно назначить любому указателю. Приведение просто загромождает код, затрудняя его понимание, отладку и т. д. - person user3629249   schedule 10.07.2017*y = 1;перекрывает указатель, который был только что установлен с помощью вызоваmalloc()со значением 1. Т.е. код теперь имеет утечку памяти, и DE-ссылка на этот указатель попытается прочитать с адреса 1 (который не является адресом, принадлежащим программе, И не выровнен должным образом для значенияint. Возможно, вы имели в виду:*(*y) = 1;- person user3629249   schedule 10.07.2017main()может бытьint main( void )илиint main( int argc, char *argv[] ). Обратите внимание, что в обеих допустимых подписях тип возвращаемого значения —int. Для функцииfunc()она ничего не возвращает, поэтому тип возвращаемого значения должен бытьvoid. - person user3629249   schedule 10.07.2017*y = 1;— это ошибка, вы должны увидеть вывод компилятора для этой строки. - person M.M   schedule 10.07.2017