我在GNU GCC编译器上运行代码时遇到问题,而它在VC ++编译器上工作正常

时间:2013-06-09 14:45:15

标签: c malloc

printf("\n enter your choice\n 1 to ask user for the size of game board\n 2 tp get input from a file\n");
scanf("%d",&choice);
if(choice==1)
{
    printf("\n enter number of rows and columns");
    scanf("%d%d",&row,&col);
    mat=(char**)malloc(row*sizeof(char));
    label=(char**)malloc(row*sizeof(char));
    for(i=0;i<row;i++)
    {
        mat[i]=(char*)malloc(col*sizeof(char));
        label[i]=(char*)malloc(col*sizeof(char));
    }

    for(i=0;i<row;i++)
    {

        for(j=0;j<col;j++)
        {
            temp=rand()%5;

            mat[i][j]=color_codes[temp];
            label[i][j]=' ';
        }

    }
}

这个C语言语句在我的visual studio IDE上正常运行,但当我尝试在CODE BLOCKS IDE上运行同样的语句时,这个东西突然崩溃了。任何一种帮助都会受到高度赞赏

3 个答案:

答案 0 :(得分:2)

在执行malloc时,有一种简单的方法可以避免这个错误,即你用错误的值乘以:

→始终乘以数组元素类型的大小sizeof(*var)

 char **mat;

 mat = malloc (row * sizeof(*mat));

这样你永远不会再次错误的乘法。另一个优点:如果您决定更改mat的类型,double,您需要更改的是一个地方:它的声明。

并且您不应该转换malloc返回值。 It's been hashed to death on SO why

答案 1 :(得分:1)

您没有分配足够的内存:

mat=(char**)malloc(row*sizeof(char));
label=(char**)malloc(row*sizeof(char));

数组中的每个项目都是指向char(char*)的指针,因此您应该乘以sizeof(char*)

mat=(char**)malloc(row*sizeof(char*));
label=(char**)malloc(row*sizeof(char*));

答案 2 :(得分:1)

两行

mat=(char**)malloc(row*sizeof(char));
label=(char**)malloc(row*sizeof(char));

看起来并不理智,你正在尝试为char分配一个指针数组,但是你只指定了一个简单char的大小。指针通常需要多一个字节。

所以你可能需要的是

mat=(char**)malloc(row*sizeof(char*));
label=(char**)malloc(row*sizeof(char*));

注意malloc的结果不一定是C,因为void* mat=malloc(row*sizeof(char*)); label=malloc(row*sizeof(char*)); 可以隐式投放到任何类型。

所以

{{1}}

也会正常工作。