2010-07-12 68 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 ++)結束,所以當你進入第一個實際上您訪問的過去最後