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

大憨熊 提交于 2019-11-29 17:47:33

问题


#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); ?


回答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.)




回答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).




回答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.




回答4:


For performance reasons, malloc() makes no guarantee regarding the contents of newly allocated memory. It might be zeros, it might be random data, it might be anything. If you want malloc'ed memory to have a specific value, then it is up to you do it.



来源:https://stackoverflow.com/questions/13410550/do-i-have-to-call-memset-after-i-allocated-new-memory-using-malloc

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!