簡體   English   中英

像這樣使用 malloc 有什么問題?

[英]what's wrong with using malloc like this?

我的以下代碼出現分段錯誤,有人可以幫我理解為什么嗎?

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); 從上面調用,並保留 rest,一旦最后一個 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

最后,在我將 function 中的前兩行更改為:

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

為什么是這樣? 什么可能導致斷言失敗? 謝謝你。

如果 MESSAGE_LENGTH 是 integer,則 sizeof(MESSAGE_LENGTH) 與 MESSAGE_LENGTH 非常不同。 (可能是 4 或 8。)您需要 malloc(MESSAGE_LENGTH),而不是 malloc(sizeof(MESSAGE_LENGTH))。

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

可能沒有按照你的想法做。 我假設MESSAGE_LENGTH是一些#define ,如果是這樣,那么你很可能得到sizeof(int)左右,而不是分配一個MESSAGE_LENGTH字節塊。

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

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實際上評估為 integer (在具有四字節整數的系統上(標准不強制這樣做))但嘗試填充五十字節,這不是一個好主意。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM