Do I have to call memset after I allocated new memory using malloc

36,065

Solution 1

malloc does not initialize the memory it allocates. You just get whatever random garbage was already in there. If you really need everything set to 0, use calloc at a performance penalty. (If you need to initialize to something other than 0, use memset for byte arrays and otherwise manually loop over the array to initialize it.)

Solution 2

C11 7.22.3.4

void *malloc(size_t size);

The malloc function allocates space for an object whose size is specified by size and whose value is indeterminate.

If you want the values to be set to zero, use calloc instead. calloc is basically just a wrapper function around one call to malloc and one call to memset (with value to set is 0).

Solution 3

When you request for a memory from heap, heap will just allocate any block of memory available to it. This block of memory may have some data depending upon a previous write.

Share:
36,065
steave
Author by

steave

Updated on October 30, 2020

Comments

  • steave
    steave over 3 years
    #include "stdlib.h"
    #include "stdio.h"
    #include "string.h"
    int main(int argc, char* argv[])
    {
        int *test = malloc(15 * sizeof(int));
        for(int i = 0;i < 15 ;i  ++ )
            printf("test is %i\n",test[i]);
    
        memset(test,0,sizeof(int) * 15);
    
        for(int i = 0 ; i < 15; i ++ )
            printf("test after memset is %i\n",test[i]);
    
        return 0;
    }
    

    The output I get is very weird:

        test is 1142126264
        test is 32526
        ...
        test is 1701409394
        test is 1869348978
        test is 1694498930
        test after memset is 0
        test after memset is 0
        test after memset is 0
        test after memset is 0
        test after memset is 0
        ...
        test after memset is 0
        test after memset is 0
        test after memset is 0
        test after memset is 0
        test after memset is 0
    

    Why would that happen? I thought I just malloced some new fresh memory that is ready to use?

    So how about this:

    int test[15];
    

    Do I have to call memset(&test,0,sizeof(int) * 15); ?

  • erickthered
    erickthered over 11 years
    Why would malloc+memset be any faster than calloc?
  • 1''
    1'' over 11 years
    It's likely not faster, but you can initialize to any value, not just zero.
  • Ciprian Tomoiagă
    Ciprian Tomoiagă about 9 years
    @1'' that is true only for byte arrays. you shouldn't use malloc to initialize, say, an array of ints to anything else than 0
  • atx
    atx over 6 years
    @CiprianTomoiagă well technically it wouldn't be a problem to malloc() garbage anyway if you're immediately going to fill that array.