0

我正在分配一个变量来保存当前时间:

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”。这里发生了什么?我认为这与我缺少指针操作有关。任何帮助将不胜感激,尤其是对我所误解的解释。

4

1 回答 1

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给出一个干净的健康账单。

于 2013-02-26T06:08:39.673 回答