malloc,memset和免费正确用法

时间:2014-10-25 23:41:41

标签: c malloc free memset

我在使用malloc,memset和free方面遇到了问题,但是没有按预期工作。问题在于最新的printf功能,而不是打印“test”,它打印一些奇怪的字符,然后进行测试,比如“@#°test”。你能解释我为什么吗?我注意到如果我在第二个malloc之后做了一个memset,一切正常。另外,如果我不调用函数“function()”,即使没有memset,我也真的不明白为什么一切正常呢

这是我的代码:

#define size 10
void function(){
   ...
   ...other code...
   ...
   char *b=malloc(size);
   read(file_ds,b,size); //file_ds stands for file descriptor, correctly opened with open function.
   memset(b,0,size);
   free(b);
}

void main(){
   ...
   ...other code...
   ...
   function(); //If I don't call this, everything works fine, even without a memset
   char *c=malloc(size);
   strcat(c,"test");
   printf("%s",c);
}

1 个答案:

答案 0 :(得分:5)

strcat期望您提供的地址指向有效字符串,并且它将尝试通过查找零字节来查找该字符串的结尾。但是,您的指针指向未初始化的内存,并且尝试读取它是未定义的行为。

malloc更改为calloc可为您提供初始化内存。但是,这可能是过度的,因为它足以拥有一个初始化的初始段,你可以像这样实现

char *c = malloc(size);
c[0] = '\0';

strcat(c, "test");  // OK