我尝试使用 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作为迭代器有关吗?
答案 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]