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

Realokace paměti – C / C++ – Fórum – Programujte.comRealokace paměti – C / C++ – Fórum – Programujte.com

 

kilroy
~ Anonymní uživatel
12 příspěvků
29. 10. 2013   #1
-
0
-

 Dobrý den, vytvořil jsem si v C funkci pro realokaci pole:

void reallocArray(char *x,unsigned int *arraySize)
{
	unsigned int oldArraySize=*arraySize;
	*arraySize+=200;

	char *newArray=(char *)malloc(((*arraySize)+1)*sizeof(char));

	for (i=0;i<=oldArraySize;++i)
	{
		newArray[i]=x[i];
	}

	int temp=*newArray;
	*x=*newArray;
	*newArray=temp;
	free(newArray);

}

Ale nějak mi s ní program nefunguje. Nevíte, kde by mohla být chyba? Díky za odpovědi

Nahlásit jako SPAM
IP: 2001:718:1001:693:f2de:f1...–
kilroy
~ Anonymní uživatel
12 příspěvků
29. 10. 2013   #2
-
0
-

#1 kilroy
Pardon, místo int temp=*newArray; má být int temp=*x; Ale stejně mi to nefunguje...

Nahlásit jako SPAM
IP: 2001:718:1001:693:f2de:f1...–
ingiraxo+15
Grafoman
29. 10. 2013   #3
-
0
-
Nahlásit jako SPAM
IP: 93.90.162.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
29. 10. 2013   #4
-
0
-

V rychlosti jsem si všiml jedné chyby: Proč nově alokované pole na konci funkce uvolníš?

Jediný důvod o vlastní implementaci realloc je snaha pochopit, jak funguje.

hu

Nahlásit jako SPAM
IP: 195.178.67.–
KIIV
~ Moderátor
+43
God of flame
29. 10. 2013   #5
-
0
-

ja tam vidim chyb daleko vic....

void reallocArray(char *x,unsigned int *arraySize) // presunute "x" se nema jak dostat ven - maximalne se uvolni stare pole (ted zatim nove) a tak podobne
{
	unsigned int oldArraySize=*arraySize;
	*arraySize+=200;

	char *newArray=(char *)malloc(((*arraySize)+1)*sizeof(char)); // mame ten realloc

	for (i=0;i<=oldArraySize;++i) // mame memcpy / memmove
	{
		newArray[i]=x[i];
	}

	int temp=*newArray; // what ????? proc do tempu davas prvni byte?
	*x=*newArray;       // ano prepisu prvni pozici x prvni pozici v newArray
	*newArray=temp;     // ted to pro jistotu prepisu zase prvni pozici z newArray
	free(newArray);     // a ted to nove pole zlikviduju... 

}
Nahlásit jako SPAM
IP: 62.216.147.–
Program vždy dělá to co naprogramujete, ne to co chcete...
kilroy
~ Anonymní uživatel
12 příspěvků
29. 10. 2013   #6
-
0
-

#5 KIIV
jasné, už jsem to upravil..

void Realloc(char *x,unsigned int *newArraySize)
{
	*newArraySize+=200;
	char *newArray=(char *)malloc(*newArraySize+1)*ziseof(char));
	strcpy(newArray,x);
	int temp=x;
	x=newArray;
	newArray=temp;
	free(newArray);
}

Ještě mi trochu dělají problém ukazatele a zapomněl jsem, že k přepointerování nesmím dát hvězdu.. Jinak díky za odpovědi

Nahlásit jako SPAM
IP: 2001:718:1001:693:f2de:f1...–
KIIV
~ Moderátor
+43
God of flame
29. 10. 2013   #7
-
0
-

jeste stale nedostanes ten novej pointer ven z funkce.... 

a co kdyz budes na 64b masine? int byva obvykle 32b ale pointer je 64b... ztracis najednou 32b z adresy jen tim, ze pointer narves do int

Nahlásit jako SPAM
IP: 94.112.35.–
Program vždy dělá to co naprogramujete, ne to co chcete...
kilroy
~ Anonymní uživatel
12 příspěvků
29. 10. 2013   #8
-
0
-

#7 KIIV
pardon, poslal jsem špatný kód.. Už si s tím hraji tak dlouho, že ani nevnímám :D  

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

void Realloc(char *x,unsigned int *arraySize)
{
	*arraySize+=200;
	char *newArray=(char *)malloc((*arraySize+1)*sizeof(char));
	strcpy(newArray,x);
	char * temp=x;
	x=newArray;
	newArray=temp;
	free(newArray);
}

int main() 
{
	unsigned int arraySize=1;
	char *array=(char *)malloc(arraySize*sizeof(char));

	Realloc(array,&arraySize);
	array[10]='0';
	return 0;
}

Tohle by snad mělo být správně...

Nahlásit jako SPAM
IP: 2001:718:1001:693:f2de:f1...–
KIIV
~ Moderátor
+43
God of flame
29. 10. 2013   #9
-
0
-

#8 kilroy
furt ti to nedostane ten pointer z Realloc ven...  pointer je taky jen hodnota... ta se pri volani zkopiruje a at uz se x zmeni jakkoliv, tak se zmenila jen ta kopie adresy uvnitr, ale ne ta venku...

Nahlásit jako SPAM
IP: 94.112.35.–
Program vždy dělá to co naprogramujete, ne to co chcete...
29. 10. 2013   #10
-
0
-

Jde to 2 způsoby:
1. funkci dáš jako parametr ukazatel na ukazatel
2. funkce bude mít návratovou hodnotu ukazatel na nově alokované pole

hu

Nahlásit jako SPAM
IP: 188.95.60.–
kilroy
~ Anonymní uživatel
12 příspěvků
29. 10. 2013   #11
-
0
-

#9 KIIV

A jo, máš pravdu..

0xd21010  adresa x před zavoláním funkce..
0xd21030  adresa nového pole
0xd21030 adresa x při přeřazení
0xd21010 adresa x po skončení funkce

Takže, abych změnil adresu pole, musí funkce vracet pointer na nově vytvořené pole, že?

Nahlásit jako SPAM
IP: 2001:718:1001:693:f2de:f1...–
kilroy
~ Anonymní uživatel
12 příspěvků
29. 10. 2013   #12
-
0
-

#10 hlucheucho
tak jsem si myslel, že už chápu docela ukazatele, ale ne :D

Nahlásit jako SPAM
IP: 2001:718:1001:693:f2de:f1...–
KIIV
~ Moderátor
+43
God of flame
29. 10. 2013   #13
-
0
-

#11 kilroy
nemusi .. ale muze... ono totiz ta alokace muze taky selhat - to taky moc nekontrolujes

jinak bys musel bys predat ukazatel na ukazatel (char ** x)  a pak s tim tak pracovat  *x pro prepsani pointeru, **x pro ziskani prvni polozky a tak

Nahlásit jako SPAM
IP: 94.112.35.–
Program vždy dělá to co naprogramujete, ne to co chcete...
kilroy
~ Anonymní uživatel
12 příspěvků
29. 10. 2013   #14
-
0
-

#13 KIIV
 Super, už to nejspíš chápu a tohle je konečně funkční... :D Díky moc všem za rady

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

char* reallocArray(char *x,unsigned int *arraySize)
{
	*arraySize+=200;
	char *newArray=(char *)malloc((*arraySize+1)*sizeof(char));
	strcpy(newArray,x);
	free(x);
	return newArray;
}

int main() 
{
	unsigned int arraySize=1;
	char *array=(char *)malloc((arraySize+1)*sizeof(char));

	array=reallocArray(array,&arraySize);
	array[10]='0';
	return 0;
}
Nahlásit jako SPAM
IP: 2001:718:1001:693:f2de:f1...–
29. 10. 2013   #15
-
0
-

Asi spoléháš na to, že pole char obsahuje vždy řetězec. memcpy by bylo univerzální

hu

Nahlásit jako SPAM
IP: 188.95.60.–
kilroy
~ Anonymní uživatel
12 příspěvků
29. 10. 2013   #16
-
0
-

#15 hlucheucho
ještě, jestli můžu otravovat, tak verze s parametrem bude vypadat takhle, že? 

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

void reallocArray( char **pointer,unsigned int *arraySize)
{
	*arraySize+=200;
	char *newArray=(char *)malloc((*arraySize+1)*sizeof(char));
	strcpy(newArray,*pointer);
	*pointer=newArray;
}

int main() 
{
	unsigned int arraySize=10;
	char *array=(char *)malloc((arraySize+1)*sizeof(char));


	char **pointer;
	*pointer=array;
	reallocArray(pointer,&arraySize);
	array=*pointer;


	array[10]='0';
	return 0;
}
Nahlásit jako SPAM
IP: 2001:718:1001:693:f2de:f1...–
KIIV
~ Moderátor
+43
God of flame
29. 10. 2013   #17
-
0
-

#16 kilroy
ted zase neuvolnujes pamet po tom puvodnim

Nahlásit jako SPAM
IP: 94.112.35.–
Program vždy dělá to co naprogramujete, ne to co chcete...
kilroy
~ Anonymní uživatel
12 příspěvků
29. 10. 2013   #18
-
0
-

#17 KIIV
Jasné, vlastně ani v té verzi, která vrací hodnotu není v mainu uvolnění... To ale teďka neřeším, jde mi pouze o to, jestli jsem konečně ty zatracené ukazatele pochopil :)

Nahlásit jako SPAM
IP: 2001:718:1001:693:f2de:f1...–
KIIV
~ Moderátor
+43
God of flame
29. 10. 2013   #19
-
0
-

#18 kilroy
ne jen v mainu ale i v reallocArray neuvolnujes

Nahlásit jako SPAM
IP: 94.112.35.–
Program vždy dělá to co naprogramujete, ne to co chcete...
kilroy
~ Anonymní uživatel
12 příspěvků
29. 10. 2013   #20
-
0
-

A je tohle správně:  

char **pointer;
	*pointer=array;
	reallocArray(pointer,&arraySize);
	array=*pointer;

nebo to má vypadat takhle:  

	char **pointer;
	char *pointer2;
	*pointer=pointer2;
	reallocArray(pointer,&arraySize);
	array=*pointer;
Nahlásit jako SPAM
IP: 2001:718:1001:693:f2de:f1...–
KIIV
~ Moderátor
+43
God of flame
29. 10. 2013   #21
-
0
-

byt tebou tak pouziju:   reallocArray(&array, &arraySize);  bez tech saskaren okolo

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

Podobná vlákna

"realokace" paměti — založil Passassa

Realokace 2D pole v C — založil Melouch

C+ - Operace s pamětí — založil Matherz

Problém s pamětí — založil michi

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ý