что не так с использованием malloc, как это? - PullRequest
0 голосов
/ 01 июня 2011

Я получил ошибку сегментации для следующего кода, может кто-нибудь помочь мне понять почему?

typedef struct ClientData {
        int _clientId;
        char _msg[200];
    } ClientData_t;

// in a function
char *id = malloc(50);
char *msg = malloc(sizeof(MESSAGE_LENGTH));
memset(id, 0, 50);
memset(msg, 0, MESSAGE_LENGTH);
strcpy(id, &(buffer[1]));
strcpy(msg, &(buffer[50]));
free(id);
printf("this message can be printed\n");
ClientData_t *newData = malloc(sizeof(ClientData_t));
// I got segmentation fault for this malloc here

Во второй раз я удалил free(id); вызов сверху и сохранил остальное, я получил следующееошибка, когда последний malloc вызывается:

mainClient1: malloc.c:3074: sYSMALLOc: Assertion `(old_top == (((mbinptr) (((char *) &((av)->bins[((1) - 1) * 2])) - __builtin_offsetof (struct malloc_chunk, fd)))) && old_size == 0) || ((unsigned long) (old_size) >= (unsigned long)((((__builtin_offsetof (struct malloc_chunk, fd_nextsize))+((2 * (sizeof(size_t))) - 1)) & ~((2 * (sizeof(size_t))) - 1))) && ((old_top)->size & 0x1) && ((unsigned long)old_end & pagemask) == 0)' failed.
Abort

и, наконец, все работает после того, как я изменил первые две строки функции на:

char id[50];
char msg[MESSAGE_LENGTH];

Почему это так?что может привести к провалу утверждения?Спасибо.

Ответы [ 3 ]

6 голосов
/ 01 июня 2011

Если MESSAGE_LENGTH является целым числом, то sizeof (MESSAGE_LENGTH) очень отличается от MESSAGE_LENGTH.(Вероятно, это 4 или 8.) Вы хотите malloc (MESSAGE_LENGTH), а не malloc (sizeof (MESSAGE_LENGTH)).

1 голос
/ 01 июня 2011

Размер чего-либо не является его значением:

pax$ cat qq.c
    #include <stdio.h>
    #define MSGLEN 50
    int main (void) {
        printf ("sizeof(MSGLEN) = %d\n", sizeof(MSGLEN));
        printf ("       MSGLEN  = %d\n", MSGLEN);
        return 0;
    }

pax$ gcc -o qq qq.c

pax$ ./qq
sizeof(MSGLEN) = 4
       MSGLEN  = 50

Если вы хотите пятьдесят байтов, используйте MSG_LEN, а не его размер. Код:

#define MESSAGE_LENGTH 50
char *msg = malloc(sizeof(MESSAGE_LENGTH));
memset(msg, 0, MESSAGE_LENGTH);

выделит четыре байта (при условии, что MESSAGE_LENGTH фактически оценивается как целое число (в системе с четырехбайтовыми целыми числами (стандарт не требует этого))), но попытается заполнить пятьдесят байтов, не очень хорошая идея.

1 голос
/ 01 июня 2011

char *msg = malloc(sizeof(MESSAGE_LENGTH));

Возможно, не то, что вы думаете.Я предполагаю, что MESSAGE_LENGTH - это какое-то #define, и если это так, то, скорее всего, вы получаете sizeof(int) или около того, а не выделяете блок MESSAGE_LENGTH байтов.

...