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. Спасибо за помощь заранее.


Показывай код, где она заполняется какими-то значениями.

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

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

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

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

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

alAb ()

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

Vinick ★★ ()

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

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

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

Cпасибо за ответ, а то уж я что-то подумал, почему не мусор, значит что-то внутреннее.

alAb ()

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

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 ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.