【问题标题】:The use of sizeof in mallocmalloc中sizeof的使用
【发布时间】:2014-04-27 20:05:15
【问题描述】:

我正在尝试将矩阵的创建包装到一个函数中,但是在尝试理解从书中提取的以下代码 sn-p 时遇到问题:

  // An error checked malloc() wrapper function
  void *ec_malloc(unsigned int size) {
     void *ptr;
     ptr = malloc(size);
     if(ptr == NULL)
        fatal("in ec_malloc() on memory allocation");
     return ptr;
  }

我已经检查了这个问题:

Do I cast the result of malloc?

现在我没有必要强制转换结果了。但我不明白的是在没有sizeof 运算符的情况下使用malloc(size)。例如,要创建一个矩阵,假设int **matrix 我也创建了这个函数:

  // An error checked malloc() wrapper function
  void **double_ec_malloc(unsigned int size) {
     void **ptr;
     ptr = malloc(size);
     if(ptr == NULL)
        fatal("in ec_malloc() on memory allocation");
     return ptr;
  }

然后我做:

  int **matrixA = double_ec_malloc(size);

  int i = 0;
  for (i = 0; i < size; i++){
    matrixA[i] = ec_malloc(size);

mallocman 说:

malloc() 函数分配 size 个字节并返回一个指向已分配内存的指针。

size4,然后在ptr = malloc(size) 中分配4 个字节,但如果矩阵是int 类型。我不需要sizeof int * 4 吗?因为现在我认为我没有为整数矩阵分配足够的内存。

【问题讨论】:

  • 这没有意义。为什么要从 malloc() 包装器返回 void **sizeof 有什么问题?如果你知道必须使用它来保证正确性,那你为什么不使用它呢?
  • 那本书充满了它。 malloc(),至少现在,需要 size_t 参数,而不是 int

标签: c pointers matrix malloc sizeof


【解决方案1】:

由于ec_malloc() 不接受数据类型参数,它假定您将自己执行sizeof(datatype) * size。因此参数unsigned int size 应该以字节为单位。

注意malloc() 本身的行为方式。

【讨论】:

  • 老兄,非常感谢!,自从我不使用 C 编程以来,我已经很长时间无法理解指针了。你的回答让我意识到我用错了ec_malloc。我只需要这样称呼它ec_malloc(sizeof(int) * tam)。我现在觉得问这个问题真是个白痴。
【解决方案2】:

malloc 函数(和您的 ec_malloc)都分配了一个线性字节区域,长度为 size 字节。

sizeof 只返回一个int,它与malloc 没有任何关系(除了它经常与malloc 一起使用)。

一个 32 位整数是 4 个字节长。 sizeof(int) 返回 4。如果你想要 4 个ints 的空间,你可以说malloc( sizeof(int) * 4 )

【讨论】:

    猜你喜欢
    • 2013-02-19
    • 2017-03-05
    • 1970-01-01
    • 2015-12-14
    • 2019-11-23
    • 2014-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多