#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 malloc
ed 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);
?
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.)
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).
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With