我在使用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);
}
答案 0 :(得分:5)
strcat
期望您提供的地址指向有效字符串,并且它将尝试通过查找零字节来查找该字符串的结尾。但是,您的指针指向未初始化的内存,并且尝试读取它是未定义的行为。
将malloc
更改为calloc
可为您提供初始化内存。但是,这可能是过度的,因为它足以拥有一个初始化的初始段,你可以像这样实现
char *c = malloc(size);
c[0] = '\0';
strcat(c, "test"); // OK