2016-03-10 78 views
0

因爲我不太瞭解我遇到的整體問題,所以調試變得非常困難。在打印字符數組時遇到問題?

char *o_key_pad = (char*)malloc(SHA256_DIGEST_LENGTH*sizeof(char)); 
for(int i = 0; i < SHA256_DIGEST_LENGTH; i++){ 
    o_key_pad[i] = 'a'; 
} 
printf("%s\n", o_key_pad); 

char *i_key_pad = (char*)malloc(SHA256_DIGEST_LENGTH*sizeof(char)); 
for(int i = 0; i < SHA256_DIGEST_LENGTH; i++){ 
    i_key_pad[i] = 'b'; 
} 

printf("%s\n", o_key_pad); 
printf("%s\n", i_key_pad); 

而我得到的輸出:

aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb 
bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb 

爲什麼陣列「o_key_pad」得到擴展到包括任何我把陣「i_key_pad」,似乎是某種內存問題?

注意:我明白,它可以做得更有效,但爲了更清楚地表明我的觀點,我已經這樣做了。

+0

你不需要(也不應該)施放'malloc'的返回值。請參閱[this](http://stackoverflow.com/a/605858/1701799)。 – RastaJedi

+0

'sizeof char == 1','sizeof'返回值的大小......字符。 –

回答

3

printf不知道從哪裏停止,除非您正確地終止了您的字符串。 C風格的字符串如下(以下兩行是等價的;在引號寫一個字符串[一個「字符串文字」]會自動創建一個空終止字符數組):

char str[] = "hello world"; 
char str2[] = { 'h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd', '\0' }; 

這是你的代碼看起來像:

int i; 
char *o_key_pad = malloc(SHA256_DIGEST_LENGTH * sizeof (char) + 1); 
for (i = 0; i < SHA256_DIGEST_LENGTH; ++i) { 
    o_key_pad[i] = 'a'; 
} 
o_key_pad[i] = '\0'; 
printf("%s\n", o_key_pad); 

char *i_key_pad = malloc(SHA256_DIGEST_LENGTH * sizeof (char) + 1); 
for (i = 0; i < SHA256_DIGEST_LENGTH; ++i) { 
    i_key_pad[i] = 'b'; 
} 
i_key_pad[i] = '\0'; 

printf("%s\n", o_key_pad); 
printf("%s\n", i_key_pad); 

/* Don't forget to free when done. */ 
free(o_key_pad); 
free(i_key pad); 
+0

您的代碼也顯示未定義的行爲。您在分配空間的末尾寫入空字符。 – owacoder

+0

@owacoder的確如此,謝謝:)。修復。 – RastaJedi

+0

耶!我第一個接受的答案! – RastaJedi

1

您的字符串不以NULL結尾,導致傳遞到printf時出現未定義的行爲。您可以再分配一個字節並添加一個NULL字符,或爲您的字符串指定最大字段寬度。

2

你有char數組,但它們沒有空間存放字符串終結符,實際上你不會追加一個。因此,內容不是合適的C字符串。當你對printf()說謊時,任何事情都可能發生,但實際上,超出數據預期範圍的打印是可能的結果。

如果你不希望添加終止符,那麼你可以把最大字段寬度到您的格式:

printf("%.32s\n", o_key_pad); 

,或者

printf("%.*s\n", SHA256_DIGEST_LENGTH, o_key_pad); 

,如果你不想將字段寬度直接硬編碼爲格式。