使用memset和malloc冲突吗?

时间:2011-11-09 19:35:22

标签: c malloc memset

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

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


大家好,谢谢你的回答。所以我理解这个问题通常来自于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 个答案:

答案 0 :(得分:3)

除了在分配内存后没有检查NULL之外,该代码没有任何问题。

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

char * buf;

buf = calloc( 1, BUFSIZ );

if( buf == NULL )
{
    /* Error management */
}

答案 1 :(得分:2)

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

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

答案 2 :(得分:0)

memset相当于:

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

所以,是的,它可以(而且)用在指针中。它将s后的(n-1)s个字节设置为c

答案 3 :(得分: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' );