Alokace paměti struktury – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Alokace paměti struktury – C / C++ – Fórum – Programujte.comAlokace paměti struktury – C / C++ – Fórum – Programujte.com

 

Meph0
Newbie
24. 6. 2013   #1
-
0
-

Opět Vás všechny zdravím. Chtěl bych se zeptat jak se správně alokuje paměť struktur a jejich kopírování, případně práce s pointery.

Můj případ:

typedef struct{
	int 	id;
	BOOL 	active;
	char 	text1;
	char 	text2;
	char 	text3;
}Data;

int main(int argc, char *argv[]){

Data *data_old[10];
Data *data_new[10];

...

napl_struct(data_old);


...

napl_struct(data_new);

...

// nahrazení data_old strukturou data_new - problém:

memcpy(data_old,data_new,sizeof(Data)*10);



return 0;

}

void napl_struct(Data *data[]){
	Data * temp_data = (Data*) malloc(sizeof(Data));
	
	// cyklus:
	// načtení dat ze souboru, vložení do temp_data
	
	//alokace paměti:
		data[file_count] = (Data*) malloc(sizeof(Data));

	//zkopírování dat z temp_data do data[file_count], char pomocí strcpy

	//konec cyklu
	
}

Zkoušel jsem i funkci memmove, ale program píše: *** buffer overflow detected ***

Problém bude v tom, že pole struktur deklaruji o velikost 10, ve skutečnosti je to ale maximální číslo a těch struktur může být různě, třeba 6, 7 ... Chybu mi to ale píše i když jsou obě pole struktur naplněný stejným počtem.

Blbě buď alokuji paměť nebo kopíruji data. Můžete někdo poradit? Díky.

Nahlásit jako SPAM
IP: 78.80.152.–
KIIV
~ Moderátor
+43
God of flame
24. 6. 2013   #2
-
0
-

No zaprve nevidim duvod proc alokovat temp, pak do data[file_count] a pak to teprve kopirovat... (zbavujes se v tomdle pripade aspon tempu? Nebo vyrabis memory leak?). Proc kopie pomoci strcpy mas tam jeden znak, tak staci prime prirazeni.. az tam bude retezec, tak to bude neco jinyho.. (jinak bych se nedivil, kdyby tady zase byl segfault)

Magicke konstanty sou taky osklivy ... vsude sama 10 a podobne.. pak si reknes ze chces 12 a musi se vsechno zmenit ... a pak nekde budes mit nahodou stejne velkou magickou konstantu kterou zmenit nechces a hups - chyba na svete...

A k tvemu problemu?

Data *data_old[10]; Data *data_new[10]; jsou pole pointeru - a ty pak zacnes kopirovat jako by tam uz ty struktury byly ulozeny cely rovnou...

Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Meph0
Newbie
24. 6. 2013   #3
-
0
-

#2 KIIV
tempu se nezbavuji :( a asi to předělám a vyhodím ten temp cely, budu rovnou načítat do data_new a data_old. 

konstamty tam mám pomocí #define MAX_FILES 10, ale sem jsem to dal pro přehlednost číslem.

K odpovědi na problém. Měl bych tedy použít:

Data * data_old[MAX_FILES] = (Data*) malloc(sizeof(Data)*MAX_FILES )

?

Nahlásit jako SPAM
IP: 78.80.152.–
KIIV
~ Moderátor
+43
God of flame
24. 6. 2013   #4
-
+1
-
Zajímavé

prave ze MAX_FILES je uz jedna polozka za koncem pole...  je to totiz 10  a posledni prvek je 9 (prvni 0)

takze bud  data_new[0] = (Data*) malloc(sizeof(Data))    a pro zbylych 9 totez..

nebo:  Data * data_new = (Data*) malloc(sizeof(Data)*MAX_FILES);   (akorat bys do funkci, co meni kam se ukazuje, musel predavat   &data_new a ne jen data  ...  a uvnitr samozrejme   Data ** ptr;   *ptr = (Data*) malloc(sizeof(Data)*MAX_FILES);  a tak dale

Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Meph0
Newbie
24. 6. 2013   #5
-
0
-

#4 KIIV
super, díky.  Jsem pro druhou variantu, jen zda jsem to dobře pochopil. malloc bude v main() i v  napl_struct() ?

Nahlásit jako SPAM
IP: 78.80.152.–
KIIV
~ Moderátor
+43
God of flame
24. 6. 2013   #6
-
0
-

#5 Meph
nemusi byt nutne... jen sem ukazoval jak se alokuje... v main muze byt prirazeno NULL... pak se preda reference na ten pointer, do nej se alokuje vicero prvku a tak dale... jen se nesmi zapomenout na tu referenci... jinak se jen zkopiruje ta hodnota  NULL, uvnitr se sice zmeni ale mimo funkci se nedostane

Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Meph0
Newbie
24. 6. 2013   #7
-
0
-

#6 KIIV
bezvadný, děkuji za pomoc, jdu to vyzkoušet.

Nahlásit jako SPAM
IP: 78.80.152.–
Meph0
Newbie
24. 6. 2013   #8
-
0
-

#6 KIIV

ještě jedna drobnost, pokud udělám toto:

Data * data_new = (Data*) malloc(sizeof(Data)*MAX_FILES)

jakým způsobem pošlu pointer nebo adresu na prvek data_new[5] do nějaké funkce? Mám pár funkci, které pracují jen s jednou strukturou z původního data_new[MAX_FILES]

Nahlásit jako SPAM
IP: 78.80.152.–
KIIV
~ Moderátor
+43
God of flame
24. 6. 2013   #9
-
0
-

adresu ziskas  &data_new[5] nebo pripadne  (data_new+5)  ...

Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Meph0
Newbie
24. 6. 2013   #10
-
0
-

#9 KIIV
tak pro (data_new+5)->text1 mi to vypíše: error: request for member ‘text1’ in something not a structure or union

a u data_new[0]->text1 je to ok, ale pro data_new[1] mám naoprávněný zápis do paměti

napln_struct(Data ** data){

*data = (Data*) malloc(sizeof(Data)*MAX_FILES);

data[1] -> id = 5; // - chyba !!

}

Nahlásit jako SPAM
IP: 78.80.152.–
KIIV
~ Moderátor
+43
God of flame
24. 6. 2013   #11
-
0
-

(*data)[1] pripadne i  data[0][1]

Nahlásit jako SPAM
IP: 86.49.86.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 142 hostů

Podobná vlákna

Dynamická alokace paměti — založil birkof

Alokace paměti polí — založil Lenka S.

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý