Указатель на указатель, я потерян

78
8

Это мой код, он компилируется и запускается:


#include <stdio.h> 
#include <stdlib.h>

int main()
{
int i,j;
int** p = (int **)malloc(2 * sizeof(int *));

p[0] = (int *)malloc(2 * sizeof(int));
p[1] = p[0];

for(i = 0; i < 2; i++)
{
for(j = 0; j < 2; j++)
{
p[i][j] = i + j;
}
}

printf("p[0][0] = %d",p[0][0]);

return 0;
}


Когда эта программа запущена, я получил: P [0] [0] = 1. Почему не P [0] [0] = 0?

спросил(а) 2015-06-03T06:56:00+03:00 4 года, 8 месяцев назад
1
Решение
98

Вы делаете p[0] и p[1] в том же месте памяти. Позже вы запустите этот цикл:


for(i = 0; i < 2; i++) 
for(j = 0; j < 2; j++)
p[i][j] = i + j;

который устанавливает p[0][0] в 0. Однако за ним следует установка p[1][0] в 1. Поскольку p[0] и p[1] равны, p[0][0] заканчивается окончанием 1.


Скорее всего вы планируете вместо

p[0] = malloc(2 * sizeof(int)); 
p[1] = p[0];

был отдельным malloc для p[1]. Вот так:


p[0] = malloc(2 * sizeof(int)); 
p[1] = malloc(2 * sizeof(int));

ответил(а) 2015-06-03T07:01:00+03:00 4 года, 8 месяцев назад
76

P [1] и p [0] назначаются в одну и ту же ячейку памяти. Таким образом, любое изменение в p [1] изменяет p [0]. Вы должны выделить отдельное пространство для p [1].

p[1]=malloc(2 * sizeof(int));

ответил(а) 2015-06-03T07:04:00+03:00 4 года, 8 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема