» »

[C] kazalec na kazalec

[C] kazalec na kazalec

atasmrk ::

Situacija je sledeca (tole je relevanten izvlecek iz kode, gre pa za parser ukazne vrstice po zagonu programa s parameri):

int parseCmdLine(int *r, int **topology)
{
     int j;

//  *topology = (int *)malloc(sizeof(int) * *r);
     *topology = (int *)calloc(*r, sizeof(int));		

     for(j = 0; j < *r; j++)
     {
          topology[j] = 1;
          printf("%d\n", *topology[j]);
     }
     return 1;
}

int main(int argc, char *argv[])
{
     int r = 5;
     int *topology;

     parseCmdLine(&r, &topology);
}


Kritičen je parseCmdLine() pri klicu malloc, calloc funkcij. Občutek imam, da ta dva klica rezervirata samo 4 bajte prostora. Med debagom je (takoj po calloc()) na nič postavjena samo *topolgy[0], topology[1] se še da zapisat, topology[2] pa propade s segmentation fault-om. Kaj delam narobe?
  • spremenilo: atasmrk ()

napsy ::

void *calloc(size_t nmemb, size_t size);

calloc() allocates memory for an array of nmemb elements of size bytes
each and returns a pointer to the allocated memory. The memory is set
to zero.

npr. calloc(20, sizeof(int));
"If you die, you die. But when you live you live. There is no time to waste."

Zgodovina sprememb…

  • spremenil: napsy ()

Jean-Paul ::

Zgornja koda je dokaz, da lahko s kazalci v C-ju kaj hitro naletiš na mino, če stvari nimaš res zelo dobro razčiščenih.

Poglej:
int** a;
lahko pomeni v C-ju dvoje:
a) a kaže na polje podatkov tipa int* ali
b) a kaže na kazalec, ki kaže na polje podatkov tipa int

V tvojem primeru gre za možnost b. Do tvojih podatkov moraš
zato dostopati tako:

(*topology)[j] = 1; /* prioriteta !!! */

in ne tako:

topology[j] = 1;

P.S. V C++ podobne konstrukte olajša uporaba referenc.

atasmrk ::

Mijonkrat hvala. Zdej ko vidim zadevo mi je jasno, kaj sem delal narobe. No, tisto, topology[j] = 1; je bil tipkarski skrat, v kodi sem imel *topology[j] = 1;


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

C - shranjevanje rezultatov iz baze v array

Oddelek: Programiranje
71197 (896) Randomness
»

[C] struct in int[] (strani: 1 2 )

Oddelek: Programiranje
657177 (6250) MrBrdo
»

[ C ] Kazalci v strukturah

Oddelek: Programiranje
61442 (1335) 64202
»

strcpy reče segmatation fault

Oddelek: Programiranje
101480 (1431) MasterMind
»

kazalci in polje

Oddelek: Programiranje
51656 (1577) rasta

Več podobnih tem