使用memset和malloc是否冲突?

使用memset和malloc是否冲突?,c,malloc,memset,C,Malloc,Memset,我认为memset用BUFSIZ的大小初始化buf变量,但malloc也会分配一个BUFSIZE大小的内存块,并将指向块开头的指针返回给变量buf。。。我不知道memset是否可以用作指针,因为它用大小BUFSIZE初始化数据,但我们不指向它。。。。 你能给我一些建议来解决这个问题吗,谢谢 大家好,谢谢你们的回答。所以我知道问题通常来自这样一个事实:malloc可能失败,然后buf将指向NULL。 也许修复代码缺陷的最好方法是检查buf是否等于null char* buf; buf = mal

我认为memset用BUFSIZ的大小初始化buf变量,但malloc也会分配一个BUFSIZE大小的内存块,并将指向块开头的指针返回给变量buf。。。我不知道memset是否可以用作指针,因为它用大小BUFSIZE初始化数据,但我们不指向它。。。。 你能给我一些建议来解决这个问题吗,谢谢


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

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

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

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

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

只要malloc没有失败并返回空指针,就可以了


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

指向的内存开始,将BUFSIZ字节设置为0。除了分配内存后不检查NULL之外,该代码没有任何问题

请注意,您还可以使用calloc分配内存,并用0初始化,因此可以避免memset调用:

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

memset
相当于:

char * buf;

buf = calloc( 1, BUFSIZ );

if( buf == NULL )
{
    /* Error management */
}
所以,是的,它可以(并且是)用于指针。它将
s
,以及
s
之后的
(n-1)
字节设置为
c

void *memset(void *s, int c, size_t n) {
    char *ss = (char *)s;
    while (n--)
        *ss++ = c;
    return s;
}
看起来很简单

memset有点像:

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.
for(无符号字符*p=buf;p
此代码没有问题。您试图解决什么问题?是什么让您认为存在问题?代码无法检查
malloc
的返回状态。在linux上(因为过度提交和OOM杀手)和其他具有受保护内存的平台上(只要SEGFULT和die是一个可接受的响应),您可以不受影响,但这通常是一种不好的做法。“在实践中malloc是否可能失败?或者这只是一种理论?”-如果没有可用内存,它将失败。。。实际上。问一个什么问题。+1推荐calloc。但不要用那可怕的演员阵容玷污一门美丽的语言+1表示不使用sizeof(char)作为第一个参数-演员1人。演员阵容是多余的,危险的,而且是完全错误的。c!=C++麦克梅德:请解释为什么它“会被需要”。演员从来都不需要。你似乎把C语言和其他一些看起来有点像C的语言混淆了。=)除了解析时的几百次之外,强制转换不会“消耗CPU周期”。对于人类读者来说,阅读和理解它只需要几分之一秒(以及几分钟的愤怒)。盘子和家具的价值损失因情况而异。这很危险,因为它隐藏了编译器检测到的错误。要隐藏的明显错误是未能包含,这将导致malloc()等人的原型。默认为“int”。当sizeof(int)!=sizeof(void*),例如在大多数64位平台上。包括stdlib和信任(void*)转换为任何指针类型都可以解决任何问题。不包括stdlib将导致(至少)错误消息/诊断。因此,最后buf将指向大小为BUFSIZ的内存块,哪个块中只有0-s?