【问题标题】:C: Cannot initialize variable with an rvalue of type void*C: 无法使用 void* 类型的右值初始化变量
【发布时间】:2014-06-15 08:10:01
【问题描述】:

我有以下代码:

int *numberArray = calloc(n, sizeof(int));

我无法理解为什么会收到以下错误。

Cannot initialize a variable of type 'int *' with an rvalue of type 'void *'`.

谢谢。

【问题讨论】:

  • int *numberArray = (int*)calloc(n, sizeof(int)); 这叫铸造。
  • 在 C++ 中,malloccalloc 需要类型转换。
  • 没有calloc 的文档了吗?
  • 嗯,如果是C++,你也可以使用new
  • @j809 我用new替换calloc,但现在他说:期望一个类型

标签: c pointers variable-initialization


【解决方案1】:

编译器的错误信息很清楚。

calloc 的返回值为void*。您将其分配给int* 类型的变量。

在 C 程序中可以,但在 C++ 程序中则不行。

您可以将该行更改为

int* numberArray = (int*)calloc(n, sizeof(int));

但是,更好的选择是使用new 运算符来分配内存。毕竟,您使用的是 C++。

int* numberArray = new int[n];

【讨论】:

    【解决方案2】:
    void* calloc (size_t num, size_t size);
    

    分配和零初始化数组。 为一个由 num 个元素组成的数组分配一块内存,每个元素的长度为 size 个字节,并将其所有位初始化为零。有效的结果是分配一个 (num*size) 个字节的零初始化内存块。

    成功时,指向函数分配的内存块的指针。 此指针的类型始终为 void*,可以将其转换为所需的数据指针类型,以便可取消引用。 如果函数未能分配请求的内存块,则返回空指针。

    总而言之,由于calloc 在内存分配成功时返回void*(通用指针),因此您必须在 C++ 中像这样进行类型转换:

    int *numberArray = (int*)calloc(n, sizeof(int));
    

    如果是 C,你仍然可以跳过这个演员表。

    或者,使用new

    int *numberArray = new int [n];
    

    【讨论】:

      【解决方案3】:

      您在 C++ 代码中使用 C 内存重新分配样式。 你要使用的是 C++ 中的new

      所以你的代码会变成:

      int n = 10; //n = size of your array
      int *narray = new int[n];
      for (int i = 0; i < n; i++)
          cout << narray[i];
      

      或者,您可以切换回 C 并使用带有强制转换的 calloc。

      int* numberArray = (int*)calloc(n, sizeof(int));
      

      【讨论】:

        【解决方案4】:

        calloc 的语法是:

        void* calloc (size_t num, size_t size);

        calloc 返回 void 指针。在您的代码中,您试图将 void 指针分配给整数指针。因此,您将无法使用“void *”类型的右值初始化“int *”类型的变量。所以在像这样分配它之前对 void 指针进行类型转换

        *numberArray = (int *) calloc(n, sizeof(int));

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-10-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多