2010-07-12 67 views
1

当我运行这个我在printf上得到segv,我做错了什么?分配字符数组和打印第一个条目

int main() { 
     char **bla; 
     int size =10; 
     int i; 

     bla = calloc(size*size,sizeof(char *)); 

     for(i=0;i<size;i++) { 
       *bla = calloc(10,sizeof(char)); 
       strncpy(*bla,"aaaaa",size); 
       bla++; 
     } 

     printf("%s\n",bla[0]); 
} 

我知道我能做到这一点与

int main() { 
     char **bla; 
     int size =10; 
     int i; 

     bla = calloc(size*size,sizeof(char *)); 

     for(i=0;i<size;i++) { 
       bla[i] = calloc(10,sizeof(char)); 
       strncpy(bla[i],"aaaaa",size); 
     } 



    printf("%s\n",bla[0]); 
    } 

,但有什么办法用指针来做到这一点?

回答

5

通过编写bla++,您将更改bla以指向下一个指针。

最后,bla[0](相当于*bla)已增加10次,并将在分配的块之后立即指向内存位置。

您可以通过在循环后编写bla -= 10来解决此问题。

然而,要解决这个问题最好的办法是不增加bla可言,而是写

*(bla + i) = calloc(10,sizeof(char)); 

或者,你可以声明第二指针(char** currentBlah = blah),并增加它来代替,然后打印blah[0],它仍然会指向原始的内存位置。

+1

我第二次建议使用第二个指针遍历数组。如果你忘记了'alloc'返回的值,那么你以后将无法'释放'内存。为获得最佳效果,请复制并不要触摸原始指针。 – bta 2010-07-12 19:47:33

+0

-1'*(bla + i)'只是'bla [i]',这正是OP要求避免的...... – 2010-07-12 19:58:10

+0

@Chris:我怀疑不是。这可能是指针的作业分配。 – SLaks 2010-07-12 20:06:59

1

问题是您的分配循环使用bla来遍历指针数组,因此在该循环结束时,bla指向数组尾部而不是开始。你需要像一个循环:

for (p=bla; p < bla+size; p++) { 
     *p = calloc(size, sizeof(char)); 
     strncpy(*p, "aaaaa", size); 
} 
0

的问题是,在第一种情况下,你已经移动了喇嘛指针越过数组(最后BLA ++)结束,所以当你进入第一个实际上您访问的过去最后