【问题标题】:what's wrong with using malloc like this?像这样使用 malloc 有什么问题?
【发布时间】:2011-06-01 04:52:42
【问题描述】:

以下代码出现分段错误,有人可以帮我理解原因吗?

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

这是为什么?什么可能导致断言失败?谢谢。

【问题讨论】:

  • 您认为在以下行时分配了多少内存:"char *msg = malloc(sizeof(MESSAGE_LENGTH));"被处决了?想一想:“sizeof(MESSAGE_LENGTH) 的值是什么?
  • 我不擅长C,但是为什么第二个malloc有sizeof(MESSAGE_LENGTH)?如果MESSAGE_LENGTHint,那么第二个malloc 只分配sizeof(int) 的内存量。

标签: c malloc segmentation-fault assertions


【解决方案1】:

如果 MESSAGE_LENGTH 是整数,则 sizeof(MESSAGE_LENGTH) 与 MESSAGE_LENGTH 非常不同。 (可能是 4 或 8。)您需要 malloc( MESSAGE_LENGTH ),而不是 malloc( sizeof( MESSAGE_LENGTH ))。

【讨论】:

    【解决方案2】:

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

    可能没有按照你的想法做。我假设MESSAGE_LENGTH 是一些#define,如果是这样,那么你很可能得到sizeof(int) 左右,而不是分配MESSAGE_LENGTH 字节块。

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 2014-03-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-02-10
        • 1970-01-01
        相关资源
        最近更新 更多