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 | 1369 (1068) | Randomness |
| » | [C] struct in int[] (strani: 1 2 )Oddelek: Programiranje | 8244 (7317) | MrBrdo |
| » | [ C ] Kazalci v strukturahOddelek: Programiranje | 1578 (1471) | 64202 |
| » | strcpy reče segmatation faultOddelek: Programiranje | 1604 (1555) | MasterMind |
| » | kazalci in poljeOddelek: Programiranje | 1841 (1762) | rasta |