2017-03-11 2 views
0

Ich habe ein Verhalten, das ich nicht verstehe. Beim Aufruf der Funktion gibt get_bloccante_multimsg (...) nichts zurück, die Variable read_m wird nicht valorisiert und der nächste Befehl wird nicht ausgeführt.Funktion liefert keinen Wert in c

Der folgende Code ist ein Teil des Programms, hoffe, dass es hilfreich ist, um das Problem zu identifizieren.

buffer.h

msg_t* get_bloccante_multimsg(int buffer, int C_id, int semid, const int N); 

buffer.c

msg_t* get_bloccante_multimsg(int buffer, int C_id, int semid, const int N) 
{ 
char* string; 
char* shared_memory; 
int *Cindex; 

struct shmid_ds shmbuffer; 

sb.sem_num = PIENE; 
sb.sem_op = -1; 
sb.sem_flg = 0; 
if (semop(semid, &sb, 1) == -1) { 
    perror("semop() consumatore P(PIENE)"); 
    exit(-9); 
} 

sb.sem_num = USO_T; 
sb.sem_op = -1; 
sb.sem_flg = 0; 
if (semop(semid, &sb, 1) == -1) { 
    perror("semop() consumatore P(USO_T)"); 
    exit(-9); 
} 

Cindex = shmat(C_id, NULL, 0); 
shmctl(buffer, IPC_STAT, &shmbuffer); 
shared_memory = (char *) shmat(buffer, (void *)0, 0); 
memcpy(string, &shared_memory[*Cindex*20], 20); 
*Cindex = (*Cindex + 1) % N; 
shmdt(Cindex); 
shmdt(shared_memory); 

sb.sem_num = USO_T; 
sb.sem_op = 1; 
sb.sem_flg = 0; 
if (semop(semid, &sb, 1) == -1) { 
    perror("semop() consumatore V(USO_T)"); 
    exit(-9); 
} 

sb.sem_num = VUOTE; 
sb.sem_op = 1; 
sb.sem_flg = 0; 
if (semop(semid, &sb, 1) == -1) { 
    perror("semop() consumatore V(VUOTE)"); 
    exit(-9); 
} 

return msg_init_string(string); 
} 

main.c

msg_t *read_m; 

for (int i = 0; i < C; i++) 
{ 
    // fork consumatore 
    cons_pid[i] = fork(); 
    switch(cons_pid[i]) { 
    case -1: // fork fallita 
     exit(-5); 
     break; 
    case 0: 
     read_m = get_bloccante_multimsg(segment_id, C_id, semid, N); 
     printf("Messaggio in array: %s", (char *)getMessage(read_m)); 
     exit(0); 
     break; 
    default: 
     break; 
    } 
} 

Vielen Dank für Ihre Hilfe.

memcpy(string, &shared_memory[*Cindex*20], 20); 

und später an:

return msg_init_string(string); 

Dies führt zu undefiniertem Verhalten

+0

Wo ist die 'msg_init_string()' Funktion, und was ist ihr Rückgabewert? Ich sehe auch keine Zuweisung für den Speicher, auf den "string" zeigt, aber Sie verwenden 'memcpy()', um Daten in diesen Speicher zu kopieren. –

+0

Dank David, habe ich die Zuordnung zu String hinzugefügt und alles funktioniert. –

Antwort

0

In der Funktion get_bloccante_multimsg(), wird der Zeiger auf charstring uninitialized in der Linie verwendet. Sie müssen Speicherplatz für die Zeichenfolge zuweisen und die Adresse string zuweisen.

Verwandte Themen