[英]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.