【问题标题】:using sizeof(void) inside malloc在 malloc 中使用 sizeof(void)
【发布时间】:2017-03-05 11:49:45
【问题描述】:

我是 C 初学者,我正面临这个问题:我创建了一个基于快速矩阵分配方法的函数(Oliveira 和 Stewart,“Writing Scientific Software”,第 94 页) 我想将它用于任何数据类型。 因此,我将其更改如下:

void ** malloc_array2d(size_t m, size_t n){

  /* pointer to array of pointers */
  void ** pointer;
  size_t i;
  /* allocate pointer array of length m */
  pointer = malloc(m*sizeof(void));
  if(pointer == NULL){
    return NULL;
  }
  /* allocate storage for m*n entries */
  pointer[0] = malloc(m*n*sizeof(void));
  if (pointer[0] == NULL) {
    free(pointer);
    return NULL;
  }
  /* set the pointers */
  for (i = 1; i < m; i++) {
    pointer[i] = pointer[0] + i*n;
  }

return pointer;
}

但我遇到分段错误。

问题是:如何允许不同数据类型的内存分配,因为 sizeof(void) 不起作用(实际上它只返回 1)? 任何反馈都非常感谢。 谢谢。

【问题讨论】:

  • 一只手拍的声音是什么?这与询问 no type 的大小是相同的哲学问题。您可能应该分配一些 bytes
  • 您必须告诉malloc_array2d 元素类型的大小,因为它无法知道您是否不这样做。你最终会得到类似void **malloc_array2d(size_t m, size_t n, size_t element_size);
  • sizeof(void) 无效。 (返回 1 作为 GCC 扩展)
  • malloc的返回类型和sizeof(void)有什么关系? void*void 不同。还有你所说的“某种替代”是什么意思?
  • 你的问题可能已经有了答案here

标签: c arrays malloc out-of-memory void-pointers


【解决方案1】:

首先sizeof(void)的值总是1,这里的void是指为无类型数据类型分配指针内存。我认为任何其他数据类型都不会占用那么少的内存。那么 int、float 等会消耗更多的数据。如果您希望 sizeof() 的值返回 1,您可以在 malloc() 函数中手动指定大小,而不是使用 sizeof() 功能以及不同的数据类型。

【讨论】:

    【解决方案2】:

    Sizeof 返回每种数据类型的字节数。 1 代表字节,2 代表 int16,4 代表 int32 等...然后您可以将其作为参数传递,但有任何问题,在使用 malloc_2darray 函数时,您应该知道要映射到的最终数据类型。

    请注意,始终使用 malloc_2darray 函数,您应该强制转换为最终数据类型指针,以便正确解释返回的指针。

    【讨论】:

    • “转换为最终数据类型”是什么意思?你是说他应该投回malloc?因为这绝对是一个巨大的NO,应该这样做!
    • 嗯,这听起来很有趣,因为我被认为是这样做的。我正在阅读有关 not 的内容。
    • 不,我的意思是使用他创建的 malloc_2darray 函数。如果不是,则程序很可能不知道如何处理使用 malloc_2darray 分配的指针(例如;char **p = malloc_2dArray(..,...); 将在此处分配给 **pa (void **)。如果下一行是 **p++ 或类似的会发生什么?它会增加一个字节指针吗?两个?没有位置增量?避免这种情况的最好方法是 char **p = (char **)malloc_2darray(..,. .)
    【解决方案3】:

    void 不是 pointer 引用的匹配类型。 pointer 引用 void *,而不是 void

    不要对被引用类型的大小进行编码,而是对取消引用指针的大小进行编码,从而避免将来出现错误。

    // pointer = malloc(m*sizeof(void));
    pointer = malloc(sizeof *pointer * m);
    

    对于下一次分配,sizeof(void) * m *nnot well defined。代码需要一种新方法。

    // pointer[0] = malloc(m*n*sizeof(void));
    

    要为各种类型分配,请传入数据类型的大小。

    void ** malloc_array2d(size_t m, size_t n, size_t data_size){
      ...
      unsigned char *p = malloc(data_size * m *n);
      ...
      for (i = 0; i < m; i++) {
        pointer[i] = p + i*n*data_size;
      }
    

    【讨论】:

    • 这对我来说很有意义,但是如果我在函数内部创建void **pointer,它如何知道大小?
    • @Mattia Paterna 传入数据大小。
    猜你喜欢
    • 1970-01-01
    • 2013-02-19
    • 2016-03-21
    • 2015-12-14
    • 1970-01-01
    • 2021-12-04
    • 2014-08-13
    • 1970-01-01
    相关资源
    最近更新 更多