PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : C variablen deklarationsproblem



sicd
07-12-2004, 13:44
Bin dabei einen simplen aber sicheren ICQ clone unter C zu programmieren und benötigte heute stunden um auf folgenden fehler zu stoßen:

wenn ich die variablendeklaration in einer anderen reihenfolge vornehme, tritt der für mich noch nie dagewesene fehler auf, dass die systemfunktion malloc() hängen bleibt (dh nie zurückkehrt, und somit keinen return wert gibt).

Dies passiert zB wenn ich "char ** a_cmd" zur ersten zeile der char-deklarationen hinzufüge. Oder wenn "t_packet* ev" eine oder mehrere zeilen weiter unten deklariert wird.

Hat jemand eine erklärung für dieses verhalten?

Mfg

ps: kernel 2.6.7, gcc 3.3.3



int start_sic_shell(int sockfd){
char cmd[CMD_LEN], *tok, c;
long src, dst;
t_packet* ev;
char ** a_cmd;
char txt[PL_TXT];
int i, j, asize;

printf("Welcome to s.i.c v%d command line interface.\n\n", VERSION);

asize = -1;


//endless loop, for every new command input
for(; {

ev = NULL;
strcpy(txt, "");

printf("[erik@s.i.c] ");
fgets(cmd, CMD_LEN, stdin);

//free the memory!
if(asize > -1)
for(j=0; j<=asize; j++){
free(a_cmd[j]);
}


//get the cmd in an array
asize = -1;
tok = strtok(cmd, " ");
do{
a_cmd[++asize] = (char *) malloc(sizeof(tok));
strcpy(a_cmd[asize], tok);
} while((tok = strtok(NULL, " ")) != NULL);

/*******************************************
* M A I N I N T E R P R E T E R C O D E
*******************************************/

wraith
07-12-2004, 14:27
Die Probleme liegen woanders.


do{
a_cmd[++asize] = (char *) malloc(sizeof(tok));
strcpy(a_cmd[asize], tok);
....

Du willst nicht die Größe von tok in Bytes haben (das ist 4), du willst die Länge des Strings (+ 1 für das Endezeichen).Also malloc(strlen(tok) + 1).

Dann ist aber auch bereits die Dereferenzierung von a_cmd (hier: a_cmd[++asize]) falsch, da a_cmd nie auf gültigen Speicher gesetzt wurde.
Zb. mit a_cmd = malloc(10 * sizeof *a_cmd);
Damit hast du dann zb. 10 Einträge, entweder du machst es so, und dann mit realloc bei Bedarf vergrößern, oder du legst eine feste Obergrenze fest mit zb. char *a_cmd[10];

Weiterhin würde ich a_size nicht auf -1 setzen am Anfang, sondern auf 0, a_size gibt dann die Anzahl an, momentan gibt a_size bei dir den maximal gültigen Index an.
Die Überprüfung auf -1 ist dann unnötig.
Und strtok kann bereits beim ersten Aufruf 0 zurückliefern, das prüfst du nicht ab.