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有可能失败吗?或者它只是一种理论?
答案 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' );