2011-06-01 56 views
0

我得到了以下代碼的段錯誤,有人可以幫我理解爲什麼嗎?像這樣使用malloc有什麼問題?

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

這是爲什麼?什麼可能導致斷言失敗?謝謝。

+0

您認爲在分配行時分配了多少內存:「char * msg = malloc(sizeof(MESSAGE_LENGTH));」被執行了?想一想:「sizeof(MESSAGE_LENGTH)產生的價值是什麼? – 2011-06-01 05:01:18

+0

我不擅長C,但爲什麼第二個malloc具有sizeof(MESSAGE_LENGTH)??如果MESSAGE_LENGTH是int,那麼第二個malloc分配只有'sizeof(int)'內存量 – Eimantas 2011-06-01 05:13:48

回答

6

如果MESSAGE_LENGTH是一個整數,那麼sizeof(MESSAGE_LENGTH)與MESSAGE_LENGTH非常不同。 (它可能是4或8)。你想要malloc(MESSAGE_LENGTH),而不是malloc(sizeof(MESSAGE_LENGTH))。

+0

你是對的..我想,那應該是問題了 – 2011-06-01 04:57:54

1

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

可能不是做你正在想什麼。我假設MESSAGE_LENGTH是一些#define,如果是的話,那麼很可能你會得到sizeof(int)左右,而不是分配MESSAGE_LENGTH字節塊。

1

事物的大小是不是它的價值:

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 

如果你想50個字節,使用MSG_LEN,而不是它的大小。代碼:

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

將分配四個字節(假設MESSAGE_LENGTH實際計算結果爲一個整數(四字節整數(標準並沒有規定這一點))的系統上),但嘗試填補 50字節,不是一個好主意。