使用C

时间:2015-06-03 16:32:20

标签: c arrays char unsigned calloc

我尝试使用 calloc 分配unsigned char**

newmatriz = (unsigned char**) calloc(width, sizeof(unsigned char));

for (j=0 ; j < width; j++)
{
    if (newmatriz[j]=(unsigned char*)calloc(witdh, sizeof(unsigned char)) == NULL){
        printf("Memory allocation error. Exit program\n");
        exit(1);
    }
}

for (i=0;i<width;i++)
{
    for(j=0;j<width;j++)
    {
        newmatriz[i][j] = 0;
    }
}

但是当我试图访问pos [i] [j]

时,我会出现分段错误

问题与使用int作为迭代器有关吗?

3 个答案:

答案 0 :(得分:2)

这句话中有一个拼写错误。而不是sizeof( unsigned char ),您必须使用sizeof( unsigned char * )

newmatriz = (unsigned char**) calloc(width, sizeof(unsigned char *));
                                                            ^^^^^^

此if语句也不正确

if ( newmatriz[j] = calloc(witdh, sizeof(unsigned char) ) == NULL){

在此语句中,newmatriz[j]设置为1或0,具体取决于内存分配是否成功。

我认为你的意思是

if ( ( newmatriz[j] = calloc(witdh, sizeof(unsigned char) ) ) == NULL){

这些循环

for (i=0;i<width;i++)
{
    for(j=0;j<width;j++)
    {
        newmatriz[i][j] = 0;
    }
}

没有意义,因为calloc已经用零初始化了已分配的内存。

答案 1 :(得分:1)

答案很简单newmatriz是一个无符号字符的数组(也就是指针)*你是分配unsigned char只需改变顶行来分配正确大小的数组,在这种情况下你需要一个字节大小为{{1}的数组不是width*sizeof(unsigned char*),因为你现在拥有它。

width*sizeof(unsigned char)

答案 2 :(得分:0)

在第二个calloc()中,有一些括号丢失:

if (newmatriz[j] = calloc(witdh, sizeof(unsigned char)) == NULL){

应该是

if ((newmatriz[j] = calloc(witdh, sizeof(unsigned char))) == NULL){

如果不这样做,calloc()的结果将与NULL进行比较,而比较结果而不是指针存储在newmatriz[j]