Dynamická alokace paměti ve struktuře definované jako nový typ proměné – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Dynamická alokace paměti ve struktuře definované jako nový typ proměné – C / C++ – Fórum – Programujte.comDynamická alokace paměti ve struktuře definované jako nový typ proměné – C / C++ – Fórum – Programujte.com

 

mat0070
Duch
14. 12. 2013   #1
-
0
-

Zdravým,

mám takovýto datový typ

typedef struct {
 unsigned int rows;
 unsigned int cols;
  char *cells;
} Bitmap;

Který definuje dvojrozměrnou matici pomocí řádků a sloupců a ukládá se do jednorozměrného pole.

Pole si alokuji pomocí této funkce

int alokujMatici (Bitmap *matice )
{
matice->cells =(char*)malloc((matice->rows*matice->cols*sizeof(char))+1);

if(matice->cells == NULL)
{
return 7;
}else
{
 return 0 ;
}
}

Program skonpiluju v pořádku, ale když ho spustím tak spadne a vrací chybu v debbugeru jsem zjistil že je to chyba 

 Program received signal SIGSEGV, Segmentation fault.

a chybu zpusobí nasledující kód

 matice->cells[AktualniCisloVMatici] = '0';

Vím že  tato chyba se výpisuje při špatné adesaci.

Zkoušel jsem si jednoduší příklad z těchto stránek a ten mě jde a proto nechápu co mám špatně.

http://www.krokodyyl.wz.cz/programovani/prog14.php

Mohl by mě s tím někdo prosím pomoct.

Nahlásit jako SPAM
IP: 90.182.248.–
sleepy
~ Anonymní uživatel
422 příspěvků
14. 12. 2013   #2
-
0
-

Nvyznam sa velmi do c, ale preco alokujes o 1 bit viac ako potrebujes? Nemoze byt problem s niecim ako zarovnanie pamate? Kedze pre pristup potrebujes prenasobit index velkostou daneho typu.

Nahlásit jako SPAM
IP: 213.215.67.–
mat0070
Duch
14. 12. 2013   #3
-
0
-

#2 sleepy
To byla chyba správně tam měl byt jeden znak navíc opravil jsem to a pořád to háže chybu i tak díky. 

Nahlásit jako SPAM
IP: 90.182.248.–
vitamin+8
Grafoman
14. 12. 2013   #4
-
0
-

#1 mat007

sprav si testovaciu funkciu:

int test(Bitmap *matice, size_t index){
	if(index < ((matice->rows*matice->cols*sizeof(char))+1))
		return 1;	//vsetko ok
	return 0;	//chyba
}

//.....
assert(test(matice, AktualniCisloVMatici));
matice->cells[AktualniCisloVMatici] = '0';
Nahlásit jako SPAM
IP: 95.105.152.–
obfuscate: "The cruel god Malloc will strike you down. "
ZMeson: "That's the C god. C++ has a new god. "
mat0070
Duch
14. 12. 2013   #5
-
0
-

#4 vitamin
Podle tohoto testu je vse ok. 

Nahlásit jako SPAM
IP: 90.182.248.–
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, 26 hostů

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ý