【问题标题】:Error: value of type "void *" cannot be assigned to an entity of type "int **"错误:“void *”类型的值不能分配给“int **”类型的实体
【发布时间】:2018-02-17 17:04:01
【问题描述】:

我正在学习 C 中的动态内存分配。我在此处搜索了相同的问题,并找到了说明这是 C++ 编译器错误的解决方案。我不明白为什么当我使用 .c 扩展而不是 .cpp 时会出现此错误。我正在使用 Visual Studio Express 2012。

如果有人需要,这是我编写的代码。这是一个输入矩阵(输入)并将其写入屏幕(输出)的简单程序:

#include <stdio.h>
#include <stdlib.h>
void main()
{
    int **a;
    int i,j,n,m;
    printf("Enter matrix dimensions:\n");
    scanf("%d%d", &n,&m);
    printf("Enter matrix:\n");
    a=malloc(n*sizeof(int*));
    for (i=0; i<n; i++)
    {
        a[i]=malloc(m*sizeof(int));
        for (j=0; j<m; j++)
        {
            scanf("%d",&a[i][j]);
        }
    }
    printf("Matrix is:\n");
    for (i=0; i<n; i++)
    {
        for (j=0; j<m; j++)
        {
            printf("%d ",a[i][j]);
        }
        putchar('\n');
    }
}

注意:我用相同的编译器在 C 中做了其他程序(没有动态内存分配),一切都很好。

编辑和更新(结论):
我结合了从Vlad from MoscowShivansh Jagga 得到的两个答案,这解决了问题。 Vlads 的回答有助于编译,Shivanshs 摆脱了错误,但我不得不说,正如 cmets 中所建议的那样,malloc 不需要 需要 类型转换并且程序 可以 em> 处理那个错误,它只是跳过它。

我看到 Shivansh Jagga 的回答由于某种原因被删除了。基本上他的回答说要摆脱你需要去的错误:
项目 > 属性 > C/C++ > 常规 > SDL 检查 > 否。

【问题讨论】:

  • 尝试投射到任何你想要的:a = (int**) malloc(n*sizeof(int))
  • 您阅读的内容是正确的...这是您使用 C++ 编译器将 C 编译为 C++ 时发生的错误。
  • 这与您的问题无关,但void main() 应该是int main(void)。 (一些编译器让你摆脱void main();这并不意味着它是正确的。)
  • @AnT:实际上,OP 试图编译为 C,但代码实际上被编译为 C++,这就是问题所在。 [c] 标签是正确的。
  • @AnT:在之前的 cmets 中,OP 已经明确表示他想将代码编译为 C。似乎他的工具链存在一些问题,导致他的代码被编译为 C++而是。

标签: c visual-studio visual-studio-2013 compiler-errors


【解决方案1】:

很明显,您正在将程序编译为 C++ 程序。

在 C 中,void * 类型的指针可以分配给任何其他类型的对象指针,而无需显式强制转换。

要将其编译为 C 程序,您应该执行以下操作。

据我所知,您应该从菜单中选择项目项目,然后选择项目属性(J 没有 IDE 的英文版),然后在面板中选择 C/C++ -> 附加,然后在右侧在面板的一侧设置项目编译为 C (/TC)

考虑到根据 C 标准,没有参数的函数 main 应声明为

int main( void )

【讨论】:

    【解决方案2】:

    不幸的是,您阅读的内容是正确的(这是由编译为 C++ 引起的),但我们无法在此处诊断您的问题,因为它们似乎在工具链中。为确保确实如此,请暂时将以下代码添加到文件顶部:

    #ifdef __cplusplus
    #error "Can't compile as C++"
    #endif
    

    这将消除任何疑问,并帮助您诊断 Visual Studio 项目中导致该项目编译为 C++ 的错误设置。

    【讨论】:

    • 添加声明 int class; 是另一种方法,尽管使用 __cplusplus 更直接。
    • 我在顶部添加了这个(在包含之前),现在出现了一个新错误:#error 指令:“无法编译为 C++”。注意:旧的也还在。
    • @Plexus:那么毫无疑问......文件肯定被编译为C++。如果您编译为 C,则该错误将消失。尝试从项目中删除和添加源文件,或仔细检查编译器设置。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-02
    • 1970-01-01
    • 1970-01-01
    • 2014-03-23
    • 1970-01-01
    • 2019-02-21
    相关资源
    最近更新 更多