-1
char* buf;
buf = malloc(BUFSIZ);
memset(buf ,0 , BUFSIZ);

我认为memset初始化buf变量的大小为BUFSIZ,但是malloc也分配了一块大小为BUFSIZE的内存,并返回一个指向该块开头的指针给变量buf……不知道memset能不能用用于指针,因为它使用大小 BUFSIZE 初始化数据,但我们不指向它....您能提出任何解决此问题的建议吗,谢谢


大家好,感谢您的回答。所以我明白问题通常来自这样一个事实,即 malloc 可能会失败,然后 buf 将指向 NULL。也许修复代码缺陷的最好方法是检查 buf 是否等于 null?

char* buf;
buf = malloc(BUFSIZ);
if(buf!=null)
{
memset(buf ,0 , BUFSIZ);
}

也许修复代码缺陷的最好方法是检查 buf 是否等于 null?

char* buf;
buf = malloc(BUFSIZ);
if(buf!=null)
{
memset(buf ,0 , BUFSIZ);
}

在实践中 malloc 是否有可能失败?或者它只是一个理论?

4

4 回答 4

3

该代码没有问题,除了在分配内存后您不检查 NULL 的事实。

注意,你也可以使用 calloc 来分配内存,初始化为 0,这样可以避免 memset 调用:

char * buf;

buf = calloc( 1, BUFSIZ );

if( buf == NULL )
{
    /* Error management */
}
于 2011-11-09T19:38:52.570 回答
2

如果 malloc 没有失败并返回一个 NULL 指针,这很好。

buf指向分配内存的开始,它是 BUFSIZ 字节大。memset 从 指向的内存开始将 BUFSIZ 字节设置为 0 buf

于 2011-11-09T19:37:35.023 回答
0

memset相当于:

void *memset(void *s, int c, size_t n) {
    char *ss = (char *)s;
    while (n--)
        *ss++ = c;
    return s;
}

所以,是的,它可以(并且正在)用在指针中。它将s(n-1)后面的字节设置sc

于 2011-11-09T19:40:55.727 回答
0
char* buf; // u declare a pointer, pointing to some random memory area
buf = malloc(BUFSIZ); // you allocate BUFSIZ bytes on the heap and set buf to point to that area.
memset( buf, 0, BUFSIZE ); // the area where buf points to are all set to 0, all BUFSIZE of them.

看起来很简单。

memset 有点像:

for (unsigned char *p = buf; p < buf + BUFSIZE; *p++ = '\0' );
于 2011-11-09T19:42:04.463 回答