Segfault beroende på ordning av variabeldeklaraion(C)?

Avdelningen för programmering, nätverk samt alternativa OS.
Post Reply
User avatar
übermensch
Hedersbit
Posts: 3190
Joined: 2002-03-08 0:03:05
Location: Kista
Contact:

Segfault beroende på ordning av variabeldeklaraion(C)?

Post by übermensch »

Stötte på ett problem som jag förvisso löst genom att bygga runt, men kan inte komma på varför det inträffar.

Har två egna typer, board och amazon som båda är typedefade OK(det funkar i ett av fallet som vi ska se...). När jag i main skriver:

Code: Select all

board *currBoard;
amazon * piece;
...
...
currBoard->board = (char**) calloc(size*size, sizeof(char*));
bygger och kompilerar så får jag segfault på calloc.


Vänder jag istället på deklarationerna så att de blir:

Code: Select all

amazon * piece;
board *currBoard

Så segfaultar den INTE på calloc. Tänkte först att det kanske beror på vilket innehåll jag har i mina struct:ar, men kan inte komma på vad det skulle vara? Det irriterande är att om jag i fallet att den segfaultar väljer att kommentera ut piece-raden så går den igenom felfritt. Då använder jag inte piece i koden som den är nu, det är bara en oanvänd pekare!

Code: Select all

typedef struct{
	char ** tiles;
	int size;
} board;

typedef struct{
	int colum;
	int waiting;
} amazon;

Det är kod från en hemuppgift, men uppgiften går inte ut på att förklara ett för mig obegripligt segfault i egenskriven kod :)

Kör gcc 4.3.4 under cygwin. Får samma fel med gcc 3.4.4. Om någon har förslag på varför det blir som det blir mottas det tacksamt :)
In cars several processors are connected by a bus
User avatar
IcePic
Hedersbit
Posts: 6061
Joined: 2002-03-08 16:09:38

Re: Segfault beroende på ordning av variabeldeklaraion(C)?

Post by IcePic »

är det verkligen på calloc den pangar och inte sen när du refererar till det?
Oh give me a clone, my very own clone,
with the Y chromosome changed to X!
And since she's my own, of my own flesh and bone,
she'll be thinking of nothing but sex!
User avatar
IcePic
Hedersbit
Posts: 6061
Joined: 2002-03-08 16:09:38

Re: Segfault beroende på ordning av variabeldeklaraion(C)?

Post by IcePic »

Om du kompilerar med -g (om den inte redan är där)
och sen kör
gdb ./min-app
(C) blabla
gdb> run
SPECTACULAR FAIL CRASH BOOM
gdb> bt full

..vad säger den då?
Oh give me a clone, my very own clone,
with the Y chromosome changed to X!
And since she's my own, of my own flesh and bone,
she'll be thinking of nothing but sex!
User avatar
übermensch
Hedersbit
Posts: 3190
Joined: 2002-03-08 0:03:05
Location: Kista
Contact:

Re: Segfault beroende på ordning av variabeldeklaraion(C)?

Post by übermensch »

Strösslade först med en massa

Code: Select all

printf("text"); och fflush(stdout);
För att hitta den och det ser onekligen ut som att den smäller i calloc då. GDB är jag inte så hemma på, men fick ut följande(satte en breakpoint precis innan det smäller):

Från den som smäller:

Code: Select all

Breakpoint 1, main () at namazon.c:21
21                      currBoard->tiles = (char**) calloc(size*size, sizeof(char*));
(gdb) bt full
#0  main () at namazon.c:21
        size = 5
        i = 0
        currBoard = (board *) 0x0
        piece = (amazon *) 0x28d000
(gdb) step

Program received signal SIGSEGV, Segmentation fault.
0x00401311 in main () at namazon.c:21
21                      currBoard->tiles = (char**) calloc(size*size, sizeof(char*));
(gdb) bt full
#0  0x00401311 in main () at namazon.c:21
        size = 5
        i = 0
        currBoard = (board *) 0x0
        piece = (amazon *) 0x28d000

Är som sagt inte jättevan vid att tolka GDB-output, men tycker det ser ut som att det är vid calloc som den hänger sig. Ska prova att bygga på en annan plattform så det inte är cygwin som spökar. Långsökt, men, ja :)
In cars several processors are connected by a bus
User avatar
übermensch
Hedersbit
Posts: 3190
Joined: 2002-03-08 0:03:05
Location: Kista
Contact:

Re: Segfault beroende på ordning av variabeldeklaraion(C)?

Post by übermensch »

Och där hittade jag problemet, tror jag. Eftersom jag inte allokerat ngn board som tillhör *currBoard så blir currBoard->tiles lite nonsens. Det som stör mig är att det funkade i det första fallet, men inte det andra. Iofs så allokerar den väl piece efter currBoard och **tiles ligger väl på ett offset från *currBoard så att den försöker skriva till något i piece och att i fallet när det funkar så skriver den bara till oallokerat minne...

Känner att jag har lite kvar att lära med C och minne :)
In cars several processors are connected by a bus
Post Reply