char *host;
host = malloc(64 * sizeof(char)); /* spazio per 64 caratteri */
memset(host,0x00,host[63]);
我有疑問:指針可以看作是一個「數組」嗎?
用上面的代碼我把NULL放入64字節? (以防止緩衝區溢出)c malloc防止緩衝區溢出
char *host;
host = malloc(64 * sizeof(char)); /* spazio per 64 caratteri */
memset(host,0x00,host[63]);
我有疑問:指針可以看作是一個「數組」嗎?
用上面的代碼我把NULL放入64字節? (以防止緩衝區溢出)c malloc防止緩衝區溢出
即使您的代碼是正確的(請參閱@ Dietrich的答案),它並不會阻止緩衝區溢出。我可以這樣做:
strcpy(host, "A very large string that's definitely a lot longer than 64 characters, so it will cause you a great deal of misery");
指針可以看作是一個數組,在C中。但是,你的代碼是錯誤的。
正確的版本:
char *host;
host = malloc(64); // sizeof(char) == 1, guaranteed by the standard
if (!host) abort(); // malloc can return NULL if it fails
host[63] = '\0'; // put NUL byte into the last element of array
當你運行memset(host, 0x00, host[63])
,它通過儲存在host[63]
作爲長度到memset的價值。這是一個錯誤,因爲host
未初始化,host[63]
是垃圾,您不應將垃圾傳遞給memset
。如果你非常幸運,你的程序將立即崩潰。如果你不走運,它不會。
將\0
字節放入host
的最後一個插槽不會避免大部分緩衝區溢出。大多數不同類型的緩衝區溢出需要單獨處理,因此沒有「單向」來阻止它們。
緩衝區溢出是一類編程錯誤,像大多數類錯誤一樣,有很多方法可以使它們失效。每個不同的緩衝區溢出只是一段不正確的代碼,需要修復。
術語注:我更喜歡使用NULL
指在C名爲「NULL」無效的指針,NUL
指零字節的ASCII字符串。例如,
// Initialize ptr to a NULL ptr...
char *ptr;
ptr = NULL;
ptr = 0; // equivalent to above
ptr = xmalloc(15);
// Set *ptr to the NUL byte...
*ptr = '\0';
*ptr = 0; // equivalent to above
「一個指針可以看作是一個數組」 - 因爲一個指針可以指向數組的第一個元素,因此「代表」該數組。 – 2012-04-24 21:24:03
此外,也許,說一些關於NULL與0 – Morpfh 2012-04-24 21:24:35
@Rune:0是NULL,至少作爲一個文字... – 2012-04-24 21:29:38
使用'memset的(主機,0,64)' - 'memset的()'希望大小爲你傳遞什麼樣的第三個參數存在未初始化的數據(所以,廢話換句話說)。 – 2012-04-24 21:23:44
'sizeof(char)'總是1,'0x00'是一個相當複雜的古老'0'表示。 – 2012-04-24 21:34:01