我在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 Moscow和Shivansh Jagga得到的两个答案,而解决了问题。 Vlads&#39;回答有助于编译和Shivanshs&#39;摆脱了错误,但我必须说,正如评论中所建议的那样,malloc不需要类型转换,程序可以处理该错误,它只是跳过它。
我看到Shivansh Jagga的答案因某些原因被删除了。基本上他的回答说要摆脱你需要去的错误:
项目&gt;属性&gt; C / C ++&gt;一般&gt; SDL检查&gt;否。
答案 0 :(得分:2)
很明显,您正在将程序编译为C ++程序。
在C中,类型void *
的指针可以在没有显式转换的情况下分配给任何其他类型的对象指针。
要将其编译为C程序,您应该执行以下操作。
据我记得你应该从菜单中选择Project项目,然后选择Project properties(J没有IDE的英文版),然后在面板中选择C / C ++ - &gt;在面板的右侧,设置项目Compile as C(/ TC)
考虑到根据C标准,没有参数的函数main应声明为
int main( void )
答案 1 :(得分:0)
不幸的是,你读的是正确的(这是由编译为C ++引起的)但我们无法在这里诊断你的问题,因为它们似乎在工具链中。要真正确保这种情况,请暂时将以下代码添加到文件的顶部:
#ifdef __cplusplus
#error "Can't compile as C++"
#endif
这将消除任何疑问,并帮助您诊断Visual Studio项目中导致将其编译为C ++的错误设置。