当我使用包含hello名称和今天日期日期的结构运行以下代码时:
typedef struct savedSite{
char *siteName;
char *date;
} SAVED_SITE;
void printSite(struct savedSite site){
printf("Site: %s\nDate Added: %s\n",site.siteName,site.date);
FILE *fpointer;
fpointer = fopen("storage.txt","a");
fprintf(fpointer,"Site: %s\nDate Added: %s\n",site.siteName,site.date);
fclose(fpointer);
}
SAVED_SITE* makeNewSite(){
SAVED_SITE* returnSite = malloc(sizeof(SAVED_SITE));
returnSite->siteName = malloc(sizeof(char)*50);
returnSite->date = malloc(sizeof(char)*25);
printf("Enter Site Name: ");
scanf("%20s", returnSite->siteName);
time_t t = time(NULL);
struct tm *tm = localtime(&t);
char s[64];
strftime(s, sizeof(s), "%c", tm);
returnSite->date = s;
return returnSite;
}
int main() {
SAVED_SITE *newSite = makeNewSite();
printSite(*newSite);
free (newSite);
return 0;
}
我得到一个控制台输出:
Site: hello
Date Added: Sat Mar 18 16:37:12 2017
但是这样的文件输出(我假设这意味着内存中存在问题,其中不是char的东西被读作char):
Site:n
Date Added: 0í
我已经测试过是否是因为内存溢出,但是当我在第一个之后添加了更多的printf时,它们的行为与预期不同,与fprintf不同。为什么这样,我怎样才能在文件中写入它在控制台中的内容?
(我修复了之前被取消的问题,因为我没有足够的信息。如果这个问题没有足够的信息,或者重新询问一个错误的做法类似的问题,让我知道。我对编程和堆栈溢出相当新,所以一般的建议值得赞赏。谢谢!)
答案 0 :(得分:3)
makeNewSite()
执行returnSite->date = s
其中s
是函数本地的数组,并且在函数返回时不再存在。函数返回后对date
成员的任何使用都会产生未定义的行为。
未定义的行为意味着C标准没有对可能发生的事情设置限制。一种可能性似乎是有效的。另一种可能性是以一种让你思考“记忆中的问题”的方式行事。另一种可能性是,你所看到的症状会随着时间的推移而变化。