2014-02-21 149 views
1

我已經初始化一個char **和在一個循環c char字符**,字符串數組空指針

char *argv[SIZE]; 
for(i=0 ; i < SIZE; i++){ 
    argv[i] = (char *) malloc(64); 
    printf("ADDRESS %d Index %d\n",argv[i],i); 
} 

中的printf示出地址由160往上走用malloc分配代替64空間,是正常?

,並讓說,我指着第二個指數爲null

argv[1] = NULL; 

他們我試圖通過

argv[1] = arg[0] + 64; 

後,我嘗試釋放其崩潰的程序,使之指向其分配的內存位置loop

free(argv [i]);

那麼我該如何讓它指向它的原始位置呢? 160從哪裏來?

在此先感謝

+0

我想'malloc'會實際上可以分配額外的空間用於跟蹤分配的內存,看到http://stackoverflow.com/questions/9390940/new-and-malloc-allocates-extra-16-bytes。 –

+0

malloc分配空間。這個空間不確定的地方。 –

回答

1

永遠不要假設分配內存的兩個塊應該「常」是在內存中相鄰。可能有分配器「記賬」數據附加在它們上面;它們可能被填充以對齊某些塊大小的效率;他們可能會在各種隨機位置使用先前分配的內存。

當你說:

argv[1] = arg[0] + 64; 

你不妨說:

argv[1] = arg[0] + 1234534321; 

這只是作爲可能是正確的。如果您想將argv[1]恢復到其原始值,請首先登錄保存,不要猜測它可能位於何處。

char *saveArgv1 = argv[1]; 
argv[1] = NULL; 
argv[1] = saveArgv1; /* now it's back to its old self */ 
+0

不要試圖從'malloc'那裏'釋放'你沒有得到的東西。 – hobbs

1

對於您的使用,您應該考慮靜態內存分配。在動態分配上,你不能做出同樣的假設。另外,打印內存地址時,您可能會發現以十六進制讀取值更爲容易。如果是,則使用%p代替%d。

#include <stdio.h> 

#define SIZE 10 

static char argv[SIZE][64]; 

int main() 
{ 
    int i; 
    for(i=0 ; i < SIZE; i++){ 
     printf("ADDRESS %p Index %d\n",argv[i],i); 
    } 
    return 0; 
}