ti i kad dinamicki alociras memoriju, npr za neki string ipak moras unijeti odredjenu duzinu znakova koja ce biti maksimalna. Ako uneses npr256 znakova. on ce koristiti koliko ti treba, ali ce maksimalan broj znakova opet biti 256
Pokazivaci(eng. pointeri)
Zaključano
Zakačeno
Da li je pozeljno uvek alocirati memoriju za svaki pokazivac ?
Ako deklarises neki pointer koji ce ti koristiti za kopiranje jednog pointera, onda ne sluzi ni cemu da alociras memoriju.
Primer:
U mom primeru je cak greska alocirati memoriju za tmp. Ako alociras, ta memorija ce biti neupotrebljena, tj. onaj poznati memory-leak.
Primer:
Code:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char *good_to_up(char *str)
{
char *tmp;
/* Pravim kopiju str-a da ne bih izgubio adresu gde se string nalazi
** Nema potrebe da se malloc-uje zato sto pravimo samo kopiju str-a, tj
** kopiju adrese gde se nalazi string
*/
tmp = str;
while(*str != '\0')
{
if((*str >= 97) && (*str <= 122))
*str = *str - 32;
str++;
}
/* Vracam staru adresu str-a, tamo gde pocinje string */
return(tmp);
}
char *bad_to_up(char *str)
{
while(*str != '\0')
{
if((*str >= 97) && (*str <= 122))
*str = *str - 32;
str++;
}
/* Primetices da ovde vracamo adresu: str + strlen(str), zato sto smo presli preko celog
** stringa, a nismo sacuvali adresu gde se nalazi string
*/
return(str);
}
int main(int argc, char *argv[])
{
char *str;
str = malloc(10);
read(1, str, 10);
printf("||%s||\n", good_to_up(str));
printf("||%s||\n", bad_to_up(str));
return(0);
}
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char *good_to_up(char *str)
{
char *tmp;
/* Pravim kopiju str-a da ne bih izgubio adresu gde se string nalazi
** Nema potrebe da se malloc-uje zato sto pravimo samo kopiju str-a, tj
** kopiju adrese gde se nalazi string
*/
tmp = str;
while(*str != '\0')
{
if((*str >= 97) && (*str <= 122))
*str = *str - 32;
str++;
}
/* Vracam staru adresu str-a, tamo gde pocinje string */
return(tmp);
}
char *bad_to_up(char *str)
{
while(*str != '\0')
{
if((*str >= 97) && (*str <= 122))
*str = *str - 32;
str++;
}
/* Primetices da ovde vracamo adresu: str + strlen(str), zato sto smo presli preko celog
** stringa, a nismo sacuvali adresu gde se nalazi string
*/
return(str);
}
int main(int argc, char *argv[])
{
char *str;
str = malloc(10);
read(1, str, 10);
printf("||%s||\n", good_to_up(str));
printf("||%s||\n", bad_to_up(str));
return(0);
}
U mom primeru je cak greska alocirati memoriju za tmp. Ako alociras, ta memorija ce biti neupotrebljena, tj. onaj poznati memory-leak.
Potpis
"The problem with the world is that everyone is a few drinks behind."
-Humphrey Bogart
-Humphrey Bogart
@ NrmMyth - Kako to mislis da se liste prave bez pointera??? Ja ne znam za to.
Zar ne moras imati nesto u svakom clanu liste i pointer ne sledeci clan, da bi imao najjednostavniju jednoulancanu listu, a za bilo sta komplikovanije treba i vise pointera. Ovo je nacin koji ja koristim, a ako postoji neki drugi - nikad nisam ni cuo za to!!!
Objasnjenje bih molio, jer sam malo sokiran ovime.
Zar ne moras imati nesto u svakom clanu liste i pointer ne sledeci clan, da bi imao najjednostavniju jednoulancanu listu, a za bilo sta komplikovanije treba i vise pointera. Ovo je nacin koji ja koristim, a ako postoji neki drugi - nikad nisam ni cuo za to!!!
Objasnjenje bih molio, jer sam malo sokiran ovime.
Potpis
De si Deda...
Ja bih rekao da ne obicne liste ne mogu da se urade bez pointera.
Potpis
"The problem with the world is that everyone is a few drinks behind."
-Humphrey Bogart
-Humphrey Bogart
Pa i ja nesto prebacujem po glavi, ali nista mi ne pada na pamet... A na kakve liste mislis kad kazes "obicne"? Kakve bi bile drukcije? Kako god da ih ulancas - mora pointerima.
Potpis
De si Deda...
Pa ono, ne cirkularne, double linked i to.
Obicne... Najobicnije... :D
One sto vas uce prvo na faksu
Obicne... Najobicnije... :D
One sto vas uce prvo na faksu
Potpis
"The problem with the world is that everyone is a few drinks behind."
-Humphrey Bogart
-Humphrey Bogart
Najjednostavnija:
Znaci - nema jednostavnije, a da ja znam za to.
Code:
struct Elem{
NekaKlasa nekiObjekat;
Elem* next;
};
struct Elem{
NekaKlasa nekiObjekat;
Elem* next;
};
Znaci - nema jednostavnije, a da ja znam za to.
Potpis
De si Deda...
To.
Potpis
"The problem with the world is that everyone is a few drinks behind."
-Humphrey Bogart
-Humphrey Bogart
@ NrmMyth : Ja jos uvek cekam tvoj primer lista bez pointera...
Potpis
"The problem with the world is that everyone is a few drinks behind."
-Humphrey Bogart
-Humphrey Bogart
Napravi si svoju 'memoriju'.
Sad vise ne pokazujes s pokazivacima nego s int-om.
Add bi izgledao ovako nesto:
Samo stvar jezicne konstrukcije i primjera radi. Hocu reci nije pametno...
Code:
static vector<T> mem;
static vector<T> mem;
Sad vise ne pokazujes s pokazivacima nego s int-om.
Add bi izgledao ovako nesto:
Code:
Cvor Add( T x )
{
mem.push_back( x );
return Cvor( mem.size()-1 );
};
Cvor Add( T x )
{
mem.push_back( x );
return Cvor( mem.size()-1 );
};
Samo stvar jezicne konstrukcije i primjera radi. Hocu reci nije pametno...
Pa cekaj, ovo nije C...
Potpis
"The problem with the world is that everyone is a few drinks behind."
-Humphrey Bogart
-Humphrey Bogart
ista stvar je...