[ Príspevkov: 6 ] 
AutorSpráva
Offline

Užívateľ
Užívateľ
Obrázok užívateľa

Registrovaný: 10.02.10
Prihlásený: 21.08.17
Príspevky: 67
Témy: 15 | 15
Bydlisko: Bratislava ...
NapísalOffline : 16.11.2012 17:05 | realloc

Zdravim mam jeden problem a uz mi z neho sibe pomaly.

Kód:
vstupc[10000];

nacitam udaj do stacickeho stringu
Kód:
fgets(vstupc,10000,stdin);


no potom mam strukturu

Kód:
struct Node
            {
            char *udaj;
            };


Kód:
struct Node* node = (struct Node*)malloc(sizeof(struct Node));
Dostanem udaj tak node->udaj = (char*) malloc(strlen(vstupc)*sizeof(char));


Potom dostanem dalsi udaj, a chcem ho pridat k tomu, co tam uz je.
Skusal som to takto
Kód:
node->udaj=realloc(node->udaj, ((strlen(node->udaj)+strlen(vstupc))* sizeof(char)));
sprintf(node->udaj, "%s%s", node->udaj, vstupc);


Zda sa, ze to aj funguje hocijake znaky, cisla medzeri vsetko funguje, ale ako nahle, dam prvy udaj 7 miestny string a nasledne chcem k nemu pridat hocijaky dlhy udaj, tak to padne.

Ale ked to debugujem tak vsetko funguje, zapise sa kam ma, vsetko sa prida tam kde ma. Uz som ztoho jelen. Dakujem, za rady.


_________________
AMD Ryzen R7 1700X, B350, 16GB Ram, 270x
Offline

Skúsený užívateľ
Skúsený užívateľ
realloc

Registrovaný: 11.01.09
Prihlásený: 25.04.26
Príspevky: 1399
Témy: 10 | 10
Bydlisko: Hrinova
NapísalOffline : 16.11.2012 18:38 | realloc

Mozes poslat viac kodu? Aspon v tej casti, kde nacitavas string a alokujes ( nech je to suvisle, aby sme vedeli posudit, ci je problem tam ).


Offline

Užívateľ
Užívateľ
Obrázok užívateľa

Registrovaný: 10.02.10
Prihlásený: 21.08.17
Príspevky: 67
Témy: 15 | 15
Bydlisko: Bratislava ...
Napísal autor témyOffline : 16.11.2012 19:08 | realloc

Kód:
while(scanf("%s",&prikaz)==1){
    temp = strcmp( prikaz, "save" );
    if (temp==0){
     fgets(vstupc,70,stdin); //udaj                                       
     root = insert(root,vstupn,vstupc+1);
     }
}


Kód:
struct Node* insert(struct Node* node, char *data, char *datas)
{
  if (node == NULL)
    return(newNode(data,datas));
  else
  {
   
    int porovnaj = strcmp( data, node->data );
    if (porovnaj < 0)     
***                                     
    {     
         
    }
    else if (porovnaj > 0)
    {
       ***
    }else if (porovnaj == 0)
    { 
      //Uz som to skusal aj takto obklukou, ale rovnakz vzsledok ako realloc
       copy= (char*) malloc(strlen(node->udaj)*sizeof(char));
       strcpy(copy,node->udaj);
       node->udaj=NULL;
       node->udaj = (char*) malloc((strlen(copy)+strlen(datas)+1)*sizeof(char));
       sprintf(node->udaj, "%s%s", copy, datas);
    }
    return node;
  }


struct Node* newNode(char *data,char *datas)
{
  struct Node* node = (struct Node*) malloc(sizeof(struct Node));
 
  node->udaj = (char*) malloc(strlen(datas)*sizeof(char));
 
   ****
  strcpy(node->udaj,datas);                //udaje
  ****
  return(node);
}


udaj v strukture staticky tak to ide vpohode. Padne to vzdy tam niekde ako sa tam pridava nova hodnota ked tam uz nejaka je, ale len ak prva bola 7 miesta :D, co absolutne nechapem.


_________________
AMD Ryzen R7 1700X, B350, 16GB Ram, 270x
Offline

Skúsený užívateľ
Skúsený užívateľ
realloc

Registrovaný: 11.01.09
Prihlásený: 25.04.26
Príspevky: 1399
Témy: 10 | 10
Bydlisko: Hrinova
NapísalOffline : 18.11.2012 10:17 | realloc

Podla tohto kodu ti neviem povedat, kde je problem. Zrejme ti ostava len viac siahnut na debugger a tam poriadne krokovat program a hlavne sledovat, kde to padne, na ktorom riadku. Zistit si hodnoty premennych a zistit, preco to padlo.


Offline

Skúsený užívateľ
Skúsený užívateľ
Obrázok užívateľa

Registrovaný: 17.07.11
Prihlásený: 29.12.20
Príspevky: 1516
Témy: 3 | 3
NapísalOffline : 18.11.2012 11:17 | realloc

Padá to teda na tomto kuse kódu, áno?
Kód:
//Uz som to skusal aj takto obklukou, ale rovnakz vzsledok ako realloc
copy= (char*) malloc(strlen(node->udaj)*sizeof(char));
strcpy(copy,node->udaj);
node->udaj=NULL;
node->udaj = (char*) malloc((strlen(copy)+strlen(datas)+1)*sizeof(char));
sprintf(node->udaj, "%s%s", copy, datas);


Skúsim teda len hádať. Copy ukazuje na pamäť o veľkosti strlen(node->udaj), takže tam nie je miesto pre ukončovaciu nulu. A to môže byť veľký problém.
node->udaj neuvoľňuješ funckiou free = memleaky jak sviňa a tie vedia často zariadiť nepredvídateľné chovanie.
Ak by si poslal celý spustiteľný kód, ľahšie by sa radilo.


_________________
Na súkromné správy týkajúce sa problémov, ktoré sa riešia vo fóre, neodpovedám!
Offline

Skúsený užívateľ
Skúsený užívateľ
realloc

Registrovaný: 11.01.09
Prihlásený: 25.04.26
Príspevky: 1399
Témy: 10 | 10
Bydlisko: Hrinova
NapísalOffline : 18.11.2012 11:52 | realloc

BX píše:
Ak by si poslal celý spustiteľný kód, ľahšie by sa radilo.

JJ, tiez som spominal, ale mozno ide o nejaky projekt do skoly, tak to tu asi nechce supnut cele.


 [ Príspevkov: 6 ] 


realloc




© 2005 - 2026 PCforum, edited by JanoF