malloc,memset和免费正确用法

tes*_*ter -1 c malloc free memset

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

这是我的代码:

#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);
}
Run Code Online (Sandbox Code Playgroud)

Ker*_* SB 5

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

更改malloccalloc为您提供初始化的内存.然而,这可能是过度的,因为它足以拥有一个初始化的初始段,你可以像thisL一样实现

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

strcat(c, "test");  // OK
Run Code Online (Sandbox Code Playgroud)

  • @daimpa:如果你是strcpy(c,"test");`,你不需要初始化内存. (3认同)