函数不会返回c中的值

时间:2017-03-11 09:21:03

标签: c function

我有一种我不理解的行为。 当我调用函数get_bloccante_multimsg(...)没有返回任何内容时,read_m变量没有增值,并且没有执行下一条指令。

下面的代码是程序的子部分,希望有助于识别问题。

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;
    }
}

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

在函数get_bloccante_multimsg()中,指向char string的指针在行中未初始化使用:

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

以后:

return msg_init_string(string);

这会导致未定义的行为。您需要为字符串分配空间并将地址分配给string