LINUX.ORG.RU

[Си] double free or corruption


0

0
#include <string.h>
#include <stdlib.h>


int main()
{
	char **test;
	
	test = malloc(4);
	int i;
	
	for(i=0; i<4; i++)
	{
		test[i] = malloc(5);
		strcpy(test[i], "test");
	}
	
	for(i=0; i<4; i++)
	{
		free(test[i]);
	}
	
	free(test);
	
	return 0;
}

Компилю gcc, запускаю. В ответ:

*** glibc detected *** ./a.out: double free or corruption (out): 0x0000000001575030 ***

и дамп памяти далее.

В чем собственно дело?

о ками-сама, зачем я это увидел?..

arsi ★★★★★ ()

> В чем собственно дело?

в кривых руках конечно,

test = malloc(4);

это ты так память на четыре указателя выделил, да?

lester ★★★★ ()
Ответ на: комментарий от vaulter

Зато на строчку короче и гораздо понятнее, особенно если проверять возвращаемое значение.

winlogon ()

Прочти как выделяют с malloc память и еще не указал под какой тип данных память выделяешь.

Zodd ★★★★★ ()
Ответ на: комментарий от Olegymous

> да, а в чем проблема?

ну как сказать... размер указателя чуть больше одного байта, хотя может я не прав конечно

lester ★★★★ ()
Ответ на: комментарий от vaulter

> Кстати, вопрос ко всем, почему не упало на

звезды удачно выстроились

lester ★★★★ ()
Ответ на: комментарий от Olegymous

2Olegymous: перечитайте, пожалуйста, Ваш учебник по С. Конкретно главу об указателях.

2winlogon: с этим согласен, но вопрос был задан по другой причине, и лишние сущности разводить смысла нет.

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

>размер указателя чуть больше одного байта, хотя может я не прав конечно

Размер указателя равен разрядности машины. На 32-х битных - 4 байта.

ttnl ★★★★★ ()
Ответ на: комментарий от winlogon

си - это не моё

спасибо, так вроде работает

#include <string.h>
#include <stdlib.h>


int main()
{
	char **test;
	
	test = malloc(4 * sizeof(char*));
	int i;
	
	for(i=0; i<4; i++)
	{
		test[i] = malloc(5 * sizeof(char));
		strcpy(test[i], "test");
	}
	
	for(i=0; i<4; i++)
	{
		free(test[i]);
	}
	
	free(test);
	
	return 0;
}

Olegymous ★★ ()
Ответ на: комментарий от ttnl

> Размер указателя равен разрядности машины. На 32-х битных - 4 байта.

сам не знаешь - решил других поучить? :) на непопсовых архитектурах( для примера, man IBM ) это не всегда так

lester ★★★★ ()
Ответ на: комментарий от vaulter

> Это был камень в огород всех отметившихся :)

нечего тут разбрасываться! (бросил камень назад)

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

>на непопсовых архитектурах( для примера, man IBM ) это не всегда так

Хорошо, что тогда такое разрядность на непопсовых архитектурах?

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

> Хорошо, что тогда такое разрядность на непопсовых архитектурах?

я тебе открою секрет - там адресация чуть сложнее происходит, чем ты думаешь, все остальное легко ищется в гугле

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

Я ВНЕЗАПНО знаю, как она происходит. Ответь на вопрос. Что по-твоему разрядность на непопсовых архитектурах?

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

опс, а я уже гневный пост накатал :) так если знаешь - то зачем спрашивать? проверяешь мои знания? или думаешь, что если я не знаю, что такое разрядность - то не смогу нагуглить? :)

lester ★★★★ ()
Ответ на: комментарий от ttnl

>http://ru.wikipedia.org/wiki/%D0%A0%D0%B0%D0%B7%D1%80%D1%8F%D0%B4%D0%BD%D0%BE...

Разрядностью компьютера называют разрядность его машинного слова.


http://ru.wikipedia.org/wiki/%D0%9C%D0%B0%D1%88%D0%B8%D0%BD%D0%BD%D0%BE%D0%B5...


Машинное слово на Power PC 32 бита. Столько же может адресовать
пользовательская программа. sizeof(void*), sizeof(unsigned long).

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

> Я ВНЕЗАПНО знаю, как она происходит.

fail

> Что по-твоему разрядность на непопсовых архитектурах?

8088. разрядность пероцессора: 16 бит. разрядность шины данных: 8 бит. разрядность шины адреса: 20 бит. вопрос: какова разрядность процессора 8088? ;)

arsi ★★★★★ ()
Ответ на: комментарий от ttnl

> Машинное слово на Power PC 32 бита

ну во-первых PPC есть и 64-бит, во-вторых на том же ppc-64 указатель занимает 16 байт ( по крайней мере при использовании «родного» компилятора ), потому-что, как я и говорил, - адресация там происходит не так просто как ты думаешь

lester ★★★★ ()
Ответ на: комментарий от ttnl

> В википедии сказано, что 8. Ты хочешь сказать, что указатели там другого размера?

а ты хочешь сказать, что они там занимают 1 байт? :)

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

>адресация там происходит не так просто как ты думаешь

Ладно, я верю, что мои мысли можно прочитать телепатически :)

Да, в PowerPC адресация происходит своим особым способом.

Но с чем ты споришь? С определением «Разрядность - размер указателя»?

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

> Но с чем ты споришь? С определением «Разрядность - размер указателя»?

это ты споришь - я давно уже указал, что это не так ;)

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

>а ты хочешь сказать, что они там занимают 1 байт? :)

Это допотопная архитектура, там все построено на сегментации.

Скорее всего программа не может оперировать памятью больше разрядности
регистров, но за счет смещений сегментов охватывается вся память.

Как в случае более позднего PAE.

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

>Как в случае более позднего PAE.

Имеется ввиду не сегменты, а разрядность шины

ttnl ★★★★★ ()
Ответ на: комментарий от lester

>> Но с чем ты споришь? С определением «Разрядность - размер указателя»?

это ты споришь - я давно уже указал, что это не так ;)


Тогда чего ты скромничаешь? Не стесняйся :) Дай свое определение

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

> Тогда чего ты скромничаешь? Не стесняйся :) Дай свое определение

определение чего?

lester ★★★★ ()
Ответ на: комментарий от ttnl

> В википедии сказано, что 8. Ты хочешь сказать, что указатели там другого размера?

какие указатели?)))) в 808х, 80186, 80286 и 80i86 при i⩾3 в «реальном» режиме было два типа указателей: near — 16bit & far 32bit (20/28 bit). правда, там было ещё переполнение адресной шины, т.н. А20, но это уже нюансы %)

arsi ★★★★★ ()
Ответ на: комментарий от lester

>я так понимаю, c ассемблерами ( в частности, например, для 8086 ) ты знаком крайне поверхностно?

Я работал со стандартными регистрами ds/cs/.. cr4 и т.д. необходимыми
для работы операционной системы. С виртуализацией и мультимедийными
регистрами дела не имел.

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

> С виртуализацией и мультимедийными регистрами дела не имел.

ну как же - писал под 8086 и не работал с виртуализацией и мультимедийными регистрами?

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

>ну как же - писал под 8086 и не работал с виртуализацией и мультимедийными регистрами?

Вопрос был про ассемблеры в целом. Протри очки и вчитайся внимательно
в мой ответ - про 8086 конкретно тебе не отвечали.

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

> Вопрос был про ассемблеры в целом. Протри очки и вчитайся внимательно

ага - а фразу «в частности» я для лысых ежиков значит написал?

в мой ответ - про 8086 конкретно тебе не отвечали.


вас там много? вы отвечаете по очереди?

lester ★★★★ ()
Ответ на: комментарий от ttnl

>> я так понимаю, c ассемблерами ( в частности, например, для 8086 ) ты знаком крайне поверхностно?

> Я работал со стандартными регистрами ds/cs/.. cr4 и т.д. необходимыми для работы операционной системы. С виртуализацией и мультимедийными регистрами дела не имел.

эм… прошу прощения, но… ttnl2, ты хоть понял, что за бред ты только что написал?

arsi ★★★★★ ()
Ответ на: комментарий от lester

>а чем DS от DX отличается - знаешь?

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

DS - регистр сегмента данных. DX - регистр общего назначения, причем половина регистра.

ttnl ★★★★★ ()
Ответ на: комментарий от arsi

>эм… прошу прощения, но… ttnl2, ты хоть понял, что за бред ты только что написал?

В смысле? Ты видел в ядре вещественную арифметику??

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

> Я начинаю в тебе разочаровываться

о, нет! не надо, умоляю!!!

DX - регистр общего назначения, причем половина регистра.


а почему не четверть, или целый? откуда эта непонятная тяга к 32-м битам?

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