导致此内存位置在某些情况下损坏的原因是什么?

时间:2017-03-19 06:55:14

标签: c memory file-io

当我使用包含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不同。为什么这样,我怎样才能在文件中写入它在控制台中的内容?

(我修复了之前被取消的问题,因为我没有足够的信息。如果这个问题没有足够的信息,或者重新询问一个错误的做法类似的问题,让我知道。我对编程和堆栈溢出相当新,所以一般的建议值得赞赏。谢谢!)

1 个答案:

答案 0 :(得分:3)

makeNewSite()执行returnSite->date = s其中s是函数本地的数组,并且在函数返回时不再存在。函数返回后对date成员的任何使用都会产生未定义的行为。

未定义的行为意味着C标准没有对可能发生的事情设置限制。一种可能性似乎是有效的。另一种可能性是以一种让你思考“记忆中的问题”的方式行事。另一种可能性是,你所看到的症状会随着时间的推移而变化。