Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
什么';像这样使用malloc有什么不对?_C_Malloc_Segmentation Fault_Assertions - Fatal编程技术网

什么';像这样使用malloc有什么不对?

什么';像这样使用malloc有什么不对?,c,malloc,segmentation-fault,assertions,C,Malloc,Segmentation Fault,Assertions,下面的代码出现了分段错误,有人能帮我理解原因吗 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_LENG

下面的代码出现了分段错误,有人能帮我理解原因吗

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

为什么会这样?什么会导致断言失败?谢谢。

如果消息长度是整数,那么sizeof(消息长度)与消息长度非常不同。(可能是4或8)您想要的是malloc(消息长度),而不是malloc(sizeof(消息长度))。

char*msg=malloc(sizeof(消息长度))


很可能没有按照你的想法去做。我假设
MESSAGE\u LENGTH
是一些
#define
,如果是这样,那么很可能您得到的是
sizeof(int)
左右,而不是分配一块
MESSAGE\u 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

将分配四个字节(假设
MESSAGE_LENGTH
实际计算为整数(在具有四个字节整数的系统上(标准不要求这样)),但尝试填充五十个字节,这不是一个好主意。

执行“char*msg=malloc(sizeof(MESSAGE_LENGTH));”行时,您认为分配了多少内存?想想看:“sizeof(MESSAGE_LENGTH)作为一个值产生了什么?我不擅长C,但是为什么第二个malloc有
sizeof(MESSAGE_LENGTH)
?如果
MESSAGE_LENGTH
int
那么第二个malloc只分配
sizeof(int)
内存量。
#define MESSAGE_LENGTH 50
char *msg = malloc(sizeof(MESSAGE_LENGTH));
memset(msg, 0, MESSAGE_LENGTH);