такое впечатление, что меня знатно наебывают
я хочу сделать двухмерный массив 5 на 5, для этого выделяю память на 5 указателей на указатели на int:
int **pptr = (int**)calloc(5, sizeof(int));
и в значению каждого указателя адрес которого хранит pptr присваиваю адрес куска памяти на пять елементов int
for(int i = 0; i<5; i++)
{
*(pptr+i)=(int*)calloc(5,sizeof(int));
}
по идее pptr хранит адрес какого то указателя в значение котрого мы запишем адрес начала куска памяти который вернёт calloc. но как это работает если pptr не указывает на какой либо указатель?
при этом если просто создать
int **pptr
и попытаться присвоить указателю, адрес которого он хранит, значение,
int *pptr = &something
то мы получим ошибку сегментации, ясное дело, pptr не хранит адрес какого либо указателя.
но почему такое не происходит когда я присваиваю *pptr адрес куска памяти который мне вернет calloc ведь pptr не хранит адрес какого либо указателя
1. Ты выделяешь память на 5 интов, а тебе нужна память на 5 указателей на инт. В каллоке поменяй
sizeof(int)
на
sizeof(int *)
2. pptr указывает на область памяти, в которую ты спокойно можешь пихать другие указатели.
3.
int **pptr;
компилятор выделит память под указатель, а что в ней будет записано уже неизвестно, поэтому, когда ты пытаешься изменить значение, используя указатель, ты не знаешь, к какой области будет обращение и насколько оно будет удачным.
int *ptr1;
int *ptr2 = malloc(sizeof(int));
*ptr1 = 5; // ошибка, мы не знаем, куда указывает ptr
*ptr2 = 5; // malloc вернул адрес, в который спокойно можно записать интовое значение
4. Вообще не понял про что ты спрашивал