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