2010-04-28 55 views
0

我發現很難確定2D無符號短指針數組中列的長度。據我所知,我已經正確地完成了內存分配。並可以正確打印它們。如何確定C++中的2D無符號短指針數組長度

PLZ看到下面的代碼段:

int number_of_array_index_required_for_pointer_abc=3; 
char A[3][16]; 


strcpy(A[0],"Hello"); 
strcpy(A[1],"World"); 
strcpy(A[2],"Tumanicko"); 


cout<<number_of_array_index_required_for_pointer_abc*sizeof(unsigned short)<<endl; 
unsigned short ** pqr=(unsigned short **)malloc(number_of_array_index_required_for_pointer_abc*sizeof(unsigned short)); 




    for(int i=0;i<number_of_array_index_required_for_pointer_abc;i++) 
    { 

     int ajira = strlen(A[i])*sizeof(unsigned short); 
     cout<<i<<" = "<<ajira<<endl; 
     pqr[i]=(unsigned short *)malloc(ajira); 
     cout<<"alocated pqr[i]= "<<sizeof pqr<<endl; 


     int j=0; 
     for(j=0;j<strlen(A[i]);j++) 
     { 
      pqr[i][j]=(unsigned short)A[i][j]; 

     } 
     pqr[i][j]='\0'; 


    } 


    for(int i=0;i<number_of_array_index_required_for_pointer_abc;i++) 
    { 

     //ln= (sizeof pqr[i])/(sizeof pqr[0]); 

     //cout<<"Size of pqr["<<i<<"]= "<<ln<<endl; 


     // I want to know the size of the columns i.e. pqr[i]'s length instead of finding '\0' 

     for(int k=0;(char)pqr[i][k]!='\0';k++) 
     cout<<(char)pqr[i][k]; 
     cout<<endl; 

    } 
+4

爲什麼在C++中使用malloc?爲什麼不使用像std :: vector這樣的標準容器呢? – 2010-04-28 10:51:20

+0

對於C++代碼來說,這是相當可怕的。你可能應該刪除C或C++標籤。 – sellibitze 2010-05-01 07:08:42

回答

0

你在這一行有一個bug:

pqr[i][j]='\0'; 

此時j等於strlen(A[i]) - 這是邊界之外你設置的pqr:

int ajira = strlen(A[i])*sizeof(unsigned short); 
pqr[i]=(unsigned short *)malloc(ajira); 

pqr[i]從開始至[strlen(A[i])-1]因此寫入pqr[i][strlen(A[i])]會溢出陣列。當你自己分配內存時,編譯器不會選擇這個。

解決這個bug是做malloc(ajira+sizeof(unsigned short))

評論

+1

'malloc(ajira + 1)'是不夠的:您需要爲未簽名的short添加內存,並添加一個字節。另外,'\ 0'將覆蓋下一個'unsigned short []'是不正確的,因爲每個數組都是分開分配的。它會調用未定義的行爲。 – interjay 2010-04-28 11:04:03

+0

順便說一句,目前的代碼工作正常。你說的是對的,但是這條線pqr [i] [j] ='\ 0'是在我沒有得到pqr [i]的長度時寫的,所以我需要一個'\ 0'標誌來確定尺寸。所以,對於你提出的改變,我也沒有得到pqr [i]的大小。 – user327742 2010-04-28 11:05:16

+0

你會得到什麼呢?它會崩潰嗎?沒有編譯?返回0?返回一個隨機數量?比預期長度還多1? – 2010-04-28 11:56:42

0

就快後編輯。你有這樣的循環:

for(int k=0;(char)pqr[i][k]!='\0';k++) ... 

一旦這個循環完成,k將有行的長度。因此,這會給你的pqr[i]長度(不包括空終止):

int k; 
for (k=0; pqr[i][k] != 0; k++) 
    ; 
cout<<"The length is "<< k <<endl; 

編輯

現在你又說,你想知道的大小,即使空終止不在這裏。沒有辦法做到這一點。你將需要有某種終結者,或者在某處存儲這個大小。如果您使用vector<unsigned short>,它會爲您存儲大小。由於它也處理分配和釋放,所以這是推薦的選擇。

< /編輯>


請注意,你有你的分配兩個錯誤:

  1. pqr是一個指針數組,但你分配一個尺寸的C*sizeof(unsigned short) 。那應該是C*sizeof(unsigned short *)

  2. 你沒有在每個字符串的末尾爲空終止符分配內存:你應該爲每個字符串分配(strlen(A[i])+1) * sizeof(unsigned short)

+0

OMG,我沒有讓你明白,我想知道pqr [i]的長度。正如你所看到的那樣,我也可以知道strlen的長度(A [i])......或者我在末尾附加'\ 0',因此確定k的長度非常簡單。問題是,當我有動態數據而不是靜態字符數組A [3] [16]時,那麼我需要通過做一些大小的技巧來檢測列大小,即pqr [i]。我現在明白了嗎? – user327742 2010-04-28 11:15:11

+1

沒有絕招:你必須自己存儲每個分配緩衝區的長度。做這件事的最簡單的方法(因爲你把它標記爲C++)是使用C++的'std :: vector'並讓它爲你做分配。 – 2010-04-28 14:36:01