当我使用此代码时
char *openFile(const char file[1024]){
FILE *f = fopen(file, "r");
char c[1000];
char *d;
if (f!=NULL) {
if (fgets(c, 1000, f) !=NULL){
d = c;
}
else{
d = "No text";
}
}
else{
d="error";
printf("%s", d);
}
fclose(f);
return d;
}
例如,获取这个长文本
fosndjfnsondfnsnkdfsjndfoweoingfoweljksdnflwkengdfwoensldkfwejlnfkdlskdfnlskdnflskdnflksndlfknslkdnflkndlknfslnlfjnlksdnjfnjwnejnfwenfnjwenlfodnakdoifnkleroglknerolkdfgnrkldsfgnlskdfgnlksdfglndlfkngkldnslkgnlkfdnkglnklsndfklnglfdlskgknllkdglksdfkkngkresoirigknlsdf
(这个文字没有任何意义,它只是一个测试)我返回char *d;
它输出这个
fosndjfnsondfnsnkdfsjndfoweoingfoweljksdnflwkengdfwoensldkfwejlnfkdlskdfnlskdnflskdnflksndlfknslkdnflkndlknfslnlfjnlksdnjfnjwnejnfwenfnjwenlfodnakdoifnkleroglknerolkdfgnrkldsfgnlskdfgnlksdfglndlfkngkldnslkgnlkfdnkglnklsndfklnglfdlskgknllkdglksdfkkngkresoir¯ˇˇˇˇˇˇˇv”[
为什么最后会出现那些奇怪的角色?
答案 0 :(得分:3)
您已在c
中将openFile
定义为本地变量。假设您的阅读成功,您将在d
中返回其地址。它在openFile
结束时被销毁,因此d
变成了悬空指针。在openFile
返回后尝试使用它会导致未定义的行为。
可能的治疗方法包括将c
定义为static
,然后返回分配了malloc
的缓冲区。将c
定义为static
会有相当多的陷阱,特别是当涉及到多线程时,因此动态分配通常会更加清晰。