我是C的新手,对malloc()的使用有几个问题: 可以重用分配的内存块吗?更具体地说,我想要做的是如下(尝试使用fgets解析文件):
#include <stdio.h>
#include <stdlib.h>
main() {
/*... some code here to open a file and give pointer to fp */
char *s=(char*) malloc(MAX_CHAR_IN_LINE);
do {
//QUESTION: is this right to reuse s in each iteration?
fgets(s,MAX_CHAR_IN_LINE,fp);
} while (*s!=NULL);
free(s);
}
谢谢!
谢谢你的回答! 以下是相关后续问答的摘要
问:我担心会出现以下情况:在第一次迭代中,读入5个字符,说“abcde”;在第二次迭代中,只有3个字符被读入(较短的一行),比如“fgh”。我最终得到了“fghde”这看起来很奇怪吗? - user3424826答:在C中,字符串以空值终止。所以是的,一些旧的字符串仍然存在,但是会有一个NUL字符标记新字符串的结尾。在将来,如果您有一个特定的问题(如那个),请提前提出,以便可以在没有所有来回的情况下解决。这只会浪费每个人的时间。 - 乔纳森莱因哈特
问:我可能会将我的问题改为:在每次重复使用之前是否有必要清除分配的空间? (在重用之前清除每个字节) 答:这个问题的答案是:这取决于。如果它是你正在使用的C字符串,那么不,它是不必要的(因为null终结符,就像我提到的那样)。如果它是一个动态分配(malloc'd)结构,那么是的,你应该memset(p,0,sizeof(* p)),或手动将每个成员设置为零。 - 乔纳森莱因哈特答案 0 :(得分:3)
是的,没关系。在'malloc'和'free'之间,记忆是你自己想做的事情。
我应该补充一点:如果malloc失败,它将返回0(无效地址)。如果发生这种情况,您的示例将在第一次迭代时发生段错误。为了解释这一点,您可以按如下方式修改您的程序:
#include <stdio.h>
#include <stdlib.h>
int main() {
/*... some code here to open a file and give pointer to fp */
char *s=(char*) malloc(MAX_CHAR_IN_LINE);
if(s == NULL) {
printf("Error: malloc failed.");
return 1;
}
do {
//QUESTION: is this right to reuse s in each iteration?
fgets(s,MAX_CHAR_IN_LINE,fp);
} while (*s!=NULL);
free(s);
return 0;
}
答案 1 :(得分:1)
malloc和free的使用是可以的,但while(* s!= NULL)在运行时可能不正确。以下可能会更好。
while (!feof(fp)) {
fgets(s,MAX_CHAR_IN_LINE,fp);
}