2017-06-26 36 views
-1

我遇到了動態創建char數組的問題。
下面的代碼是導致這些問題的例子:今天我分配頂級數組

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

int main (void){ 

     char** top = NULL; 
     top = malloc(30*sizeof(char)); 

     printf("sizeof top:%d\n",sizeof(top)); 

     for(int i = 0; i < sizeof(top); i++){ 
       top[i] = malloc(12*sizeof(char)); 
       strcpy(top[i],"Lorem Ipsum"); 
     } 


     for(int i = 0; i < sizeof(top); i++){ 
       printf("%d: %s\tsize: %d\n",i,top[i],strlen(top[i])); 
     } 
} 

預期的輸出應該是這樣的:

sizeof top:30 
0: Lorem Ipsum size: 11 
1: Lorem Ipsum size: 11 
2: Lorem Ipsum size: 11 
3: Lorem Ipsum size: 11 
4: Lorem Ipsum size: 11 
5: Lorem Ipsum size: 11 
6: Lorem Ipsum size: 11 
7: Lorem Ipsum size: 11 

,而是我得到這樣的輸出:

sizeof top:8 
0:  size: 0 
1: Lorem Ipsum size: 11 
2: Lorem Ipsum size: 11 
3: Lorem Ipsum size: 11 
4: Lorem Ipsum size: 11 
5: Lorem Ipsum size: 11 
6: Lorem Ipsum size: 11 
7: Lorem Ipsum size: 11 

我已經試圖改變所有數組的大小,但保持不變。我真的不明白爲什麼上面的大小停留在8,即使我嘗試分配更多的內存,爲什麼存儲到數組的第一個字符串將不會正確顯示,而其他人卻這麼做。經過一番研究,我找不到有關類似問題的任何信息。有人可以向我解釋這種情況,或推薦一個可靠的來源?

在此先感謝!

編輯:我認爲這個問題必須與char **數組的用法(它做的)有關。我不知道真正的問題是sizeof返回的值。 非常感謝您的答覆和快速幫助。

+1

你不能用'malloc'獲得分配內存的大小。你分配'30 * sizeof(char)(= 30)'字節。沒有辦法「回到」30「。 –

+1

尺寸不符合你的想法。 'sizeof'返回一個指針的大小而不是指向的值。 – user1937198

+0

順便說一句:你需要'頂部= malloc(30 * sizeof(char *));'而不是'top = malloc(30 * sizeof(char));'。你想爲30個_pointers_而不是30個_chars_分配空間。 –

回答

0

這很可能不會導致你(可能)打算什麼:

char** top = malloc(30*sizeof(char)); 

頂部本身是一個指針爲char *,所以它可能指向任何一個char *本身或數組的。所以,你居然會需要:

char** top = malloc(30*sizeof(char*)); 
//        ^

但作爲頂部是一個指針,sizeof(top)會給你一個指針的系統上的大小(任意一種),最有可能的8(如在現代的64位硬件)。

sizeof只適用,如果你運用它直接陣列預期(而不必如它們傳遞給函數,在這種情況下,它們是作爲唯一的指針傳遞!):

int a[7]; 
size_t n0 = sizeof(a); // n == 7*sizeof(int) 
// if you want the number of elements (which is what you normally do) 
// (and you missed that above, too!): 
size_t n1 = sizeof(a)/sizeof(*a); 
// alternatively: 
size_t n2 = sizeof(a)/sizeof(a[0]); 

當你使用指針,你必須保持你的數組長度在別處:

for(int i = 0; i < 30; ++i) 
//    ^instead of sizeof(top) - but bad, see below! 

嗯,當然,現在你在代碼幻數,這就是你(!正確的)希望避免...

解決方案:使用的常量,或者爲const變量或作爲限定:

size_t const NumberOfElements = 30; 
#define NUMBER_OF_ELEMENTS 30 

如果要能夠修改的長度(即G。通過realloc)的定義是的,你需要一個非const變量:

size_t NumberOfElements = 30; 

如果不使用整個陣列的時候,你可能需要兩個變量,我個人比較喜歡使用的容量和大小(以C++的std::vector風格):

size_t capacity = 32; // initial capacity 
size_t size  = 0; // current size 

考慮前綴,以避免名稱collistions,如果需要的話。

0

sizeof(top)編譯時間中被評估。

malloc運行時間中執行。

因此,無法在運行時從sizeof(top)接收30字節。


  • VLA(可變長度數組),爲的是一個例外。在這種情況下,sizeof將在運行時動態評估。

    int x; 
    scanf("%d", &x); 
    char ch[x]; 
    printf("%d\n", (int)sizeof ch); 
    

    如果7讀入xchsizeof將在運行時進行評估,將打印7

+0

這個邏輯不適用於'int x; scanf(「%d」,&x); char ch [x]; printf(「%d \ n」,(int)sizeof ch);' –

+0

@ M.M Right thanks,Updated。 – SHG