我正在分配一个变量来保存当前时间:
struct tm *cur = malloc (sizeof (cur));
time_t t = time (NULL);
localtime_r (&t, cur);
然后打印年份。它是正确的。接下来,我进入一个循环,我从文件中分配一个新的变量时间值:
struct stat file_stats;
struct tm *file = malloc (sizeof (file));
lstat (argv[itor], &file_stats);
//check1
localtime_r(&file_stats.st_mtime, file);
//check2
在“check1”处,cur->tm_year
打印出正确合理的值。在“check2”,cur->tm_year
打印“0”。这里发生了什么?我认为这与我错过指针操作的东西有关。任何帮助将不胜感激,特别是对我误解的解释。
答案 0 :(得分:2)
我将您的代码改编为SSCCE:
#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <time.h>
int main(int argc, char **argv)
{
struct tm *cur = malloc(sizeof(cur));
time_t t = time (NULL);
localtime_r(&t, cur);
printf("curr 1 year: %d\n", cur->tm_year + 1900);
for (int itor = 1; itor < argc; itor++)
{
struct stat file_stats;
struct tm *file = malloc(sizeof(file));
file->tm_year = 0;
if (lstat(argv[itor], &file_stats) == 0)
{
printf("curr 2 year: %d\n", cur->tm_year + 1900);
localtime_r(&file_stats.st_mtime, file);
printf("curr 3 year: %d\n", cur->tm_year + 1900);
printf("file 1 year: %d\n", file->tm_year + 1900);
}
}
return(0);
}
我运行的结果是:
curr 1 year: 2013
curr 2 year: 2013
curr 3 year: 2013
file 1 year: 2013
curr 2 year: 2013
curr 3 year: 2013
file 1 year: 2010
curr 2 year: 2013
curr 3 year: 2013
file 1 year: 2013
curr 2 year: 2013
curr 3 year: 2013
file 1 year: 2011
我有一些旧文件很有用。从表面上看,看起来没问题。但是,valgrind
适合:
==50495== Memcheck, a memory error detector
==50495== Copyright (C) 2002-2012, and GNU GPL'd, by Julian Seward et al.
==50495== Using Valgrind-3.8.1 and LibVEX; rerun with -h for copyright info
==50495== Command: ltr 3d.c const-stuff.c ltr.c madump.c pthread-1.c pthread-2.c pthread-3.c recv.c regress.c send.c strandsort.c x.c
==50495==
==50495== WARNING: Support on MacOS 10.8 is experimental and mostly broken.
==50495== WARNING: Expect incorrect results, assertions and crashes.
==50495== WARNING: In particular, Memcheck on 32-bit programs will fail to
==50495== WARNING: detect any errors associated with heap-allocated data.
==50495==
==50495== Invalid write of size 4
==50495== at 0x105C48: timesub (in /usr/lib/system/libsystem_c.dylib)
==50495== by 0x1058FE: _st_localsub (in /usr/lib/system/libsystem_c.dylib)
==50495== by 0x10609D: localtime_r (in /usr/lib/system/libsystem_c.dylib)
==50495== by 0x100000DE8: main (ltr.c:10)
==50495== Address 0x10001b188 is 0 bytes after a block of size 8 alloc'd
==50495== at 0x5686: malloc (vg_replace_malloc.c:274)
==50495== by 0x100000DC3: main (ltr.c:8)
==50495==
==50495== Invalid write of size 4
==50495== at 0x105C70: timesub (in /usr/lib/system/libsystem_c.dylib)
==50495== by 0x1058FE: _st_localsub (in /usr/lib/system/libsystem_c.dylib)
==50495== by 0x10609D: localtime_r (in /usr/lib/system/libsystem_c.dylib)
==50495== by 0x100000DE8: main (ltr.c:10)
==50495== Address 0x10001b198 is 16 bytes after a block of size 8 alloc'd
==50495== at 0x5686: malloc (vg_replace_malloc.c:274)
==50495== by 0x100000DC3: main (ltr.c:8)
==50495==
输出以类似的方式持续了很长一段时间。但它突出了问题:您应该在sizeof(*cur)
来电中使用sizeof(*file)
和malloc()
。产量:
#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <time.h>
int main(int argc, char **argv)
{
struct tm *cur = malloc(sizeof(*cur));
time_t t = time (NULL);
localtime_r(&t, cur);
printf("curr 1 year: %d\n", cur->tm_year + 1900);
for (int itor = 1; itor < argc; itor++)
{
struct stat file_stats;
struct tm *file = malloc(sizeof(*file));
file->tm_year = 0;
if (lstat(argv[itor], &file_stats) == 0)
{
printf("curr 2 year: %d\n", cur->tm_year + 1900);
localtime_r(&file_stats.st_mtime, file);
printf("curr 3 year: %d\n", cur->tm_year + 1900);
printf("file 1 year: %d\n", file->tm_year + 1900);
}
}
return(0);
}
并valgrind
给出了一份清洁的健康状况。