C - 像这样使用 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 printedn");
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];

为什么会这样?是什么原因导致断言失败?非常感谢。

如果MESSAGE_LENGTH是一个整数,那么sizeof(MESSAGE_LONGTH)与MESSAGE_LINGTH非常不同。(可能是4或8。)您想要malloc(MESSAGE_LENGTH),而不是malloc。

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) = %dn", sizeof(MSGLEN));
        printf ("       MSGLEN  = %dn", 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实际计算为整数(在具有四个字节整数的系统上(标准不强制要求这样做)),但尝试填充五十个字节,这不是一个好主意。

相关内容

  • 没有找到相关文章

最新更新