Использование memset и malloc конфликтует? - PullRequest
0 голосов
/ 09 ноября 2011
char* buf;
buf = malloc(BUFSIZ);
memset(buf ,0 , BUFSIZ);

Я думаю, что memset инициализирует переменную buf размером BUFSIZ, но malloc также выделяет блок размера BUFSIZE памяти и возвращает указатель на начало блока переменной buf ... Я незнаю, можно ли использовать memset для указателей, потому что он инициализирует данные с размером BUFSIZE, но мы не собираемся указывать на него .... Можете ли вы предложить что-нибудь, чтобы решить эту проблему, спасибо


Всем привет и спасибоответы.Таким образом, я понял, что проблема, как правило, связана с тем, что malloc может завершиться ошибкой, и тогда buf будет указывать на NULL.И, может быть, лучший способ исправить недостаток кода - проверить, равно ли значение buf нулю?

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

Может быть, лучший способ исправить недостаток кода - проверить, является ли bufравно нулю?

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

Возможно ли на практике malloc потерпеть неудачу?Или это просто теория?

Ответы [ 4 ]

3 голосов
/ 09 ноября 2011

С этим кодом проблем нет, за исключением того факта, что вы не проверяете NULL после выделения памяти.

Обратите внимание, что вы также можете использовать calloc для выделения памяти, инициализированной 0, чтобы вы могли избежать вызова memset:

char * buf;

buf = calloc( 1, BUFSIZ );

if( buf == NULL )
{
    /* Error management */
}
2 голосов
/ 09 ноября 2011

При условии, что malloc не завершится с ошибкой и вернет нулевой указатель, это нормально.

buf указывает на начало выделенной памяти, которое является большим байтом BUFSIZ. memset устанавливает байты BUFSIZ в 0, начиная с памяти, на которую указывает buf.

0 голосов
/ 09 ноября 2011
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' );
0 голосов
/ 09 ноября 2011

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.

...