LINUX.ORG.RU

Небольшой вопрос по си и GCC - malloc для структуры с указателями

 ,


0

2

Здравствуйте. Имеется структура на языке Си.

typedef struct {
	int * oneNumber;
	int * twoNumber;
} twoNumbers;
В коде пишем
twoNumbers * tnTestPointer;
И разумеется выделяем память
tnTestPointer = malloc( sizeof( twoNumbers ) );
Вопрос - на каком основании компилятор GCC после выполнения malloc для структуры определяет 2 указателя на внутренние числа в 1 адрес памяти?(на примере 0xbaadf00d).

Понимаю что в дальнейшем нужно делать 2 malloc для oneNumber и twoNumber. Но мне интересна логика его работы, если структура представляет внутри себя одни лишь указатели. Просто до маллока у нас находится какой-то мусор в указателях(что совершенно правильно, ведь мы создали переменную со значением указателя на память, но не выделели память), после же маллока - идет еще выставка одинакового значения для внутренних элементов. Т.е. такая структура если не выделять память под внутренние элементы превращается в юнион?

Смотрел через GDB. Спасибо за помощь заранее.



Последнее исправление: alAb (всего исправлений: 1)

Ответ на: комментарий от anonymous

Я вроде все расписал, кроме оператора маллок.

twoNumbers * tnTestPointer;
tnTestPointer = malloc(  sizeof( twoNumbers  ) );
После этой строки кода имеем выделенную память под структуру, и в GDB смотрю что маллок еще и поменял значения внутренних указателей интов на одинаковое значение. Вопрос в том что почему именно на одинаковое.

alAb
() автор топика
Ответ на: комментарий от alAb

Ну да, и чтобы заполнить какими-то значениями нужно уже иметь выделенную память под инты эти, т.е. или вызвать маллок и через разыменование заполнить, или же подставить адрес на уже выделенные в памяти инты.

alAb
() автор топика

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

Vinick ★★
()

Может они ещё до маллока одинаковые.

До маллока твой tnTestPointer указывает в кусок памяти, где значения разные. После маллока он указывает в другой кусок памяти, где значения могут быть одинаковыми. Проверял?

anonymous
()

Многие компиляторы заполняют кучу специальным мусором, чтобы сразу было видно неинициализированную память.

German_1984 ★★
()

Так значение указателя же изменилось.

до маллока у нас находится какой-то мусор в указателя

Как ты разыменовывал указатель до malloc? А если вдруг он null случайно оказался? Вот после маллока можно разыменовать, но опять же, память может никто специально и не трогал, просто указатель теперь на выделенную область смотрит, а что там находилось — кто его знает.

Kiborg ★★★
()

Вопрос - на каком основании компилятор GCC после выполнения malloc для структуры определяет 2 указателя на внутренние числа в 1 адрес памяти?(на примере 0xbaadf00d).

Он не определяет. В указателях лежит мусор (т.е. они указывают хрен знает куда, и попытка их разыменовать влечёт undefined behavior), до тех пор, пока ты сам не изволишь ручками их инициализировать.

Если ты хочешь, чтобы мусора не было, используй calloc: вместо мусора будут нули.

Manhunt ★★★★★
()

в поискoвикax: magic number 0xbaadf00d fdfdfdfd cdcdcdcd + нaдo различать debug & release

p.s.: по xopoшему и это окупится сторицей (!!!), надо писать обертку над: malloc/free (new/delete) в поискoвикax: memory leak detector

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.