Forum » Programiranje » [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):
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?
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));
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.
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 ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | C - shranjevanje rezultatov iz baze v arrayOddelek: Programiranje | 1249 (948) | Randomness |
» | [C] struct in int[] (strani: 1 2 )Oddelek: Programiranje | 7504 (6577) | MrBrdo |
» | [ C ] Kazalci v strukturahOddelek: Programiranje | 1476 (1369) | 64202 |
» | strcpy reče segmatation faultOddelek: Programiranje | 1517 (1468) | MasterMind |
» | kazalci in poljeOddelek: Programiranje | 1692 (1613) | rasta |