为什么我在我的c程序中收到警告?

时间:2017-04-29 01:01:47

标签: c pointers memory-leaks out-of-memory dynamic-allocation

我的c代码如下,工作正常。我不知道警告的原因

#include<stdio.h>
#include<time.h>
#include<string.h>
#include<stdlib.h>
#define _XOPEN_SOURCE

char *MMDDYYYYToEpoch(char str[]);

int main()
{
    char str[12]= "04252017";
    printf("epoch value of %s is %s\n",str,MMDDYYYYToEpoch(str));
    char st[12]= "10312001";
    printf("epoch value of %s is %s\n",st,MMDDYYYYToEpoch(st));
    char sr[12]= "07291999";
    printf("epoch value of %s is %s\n",sr,MMDDYYYYToEpoch(sr));
    return 0;

}

char *MMDDYYYYToEpoch(char str[])
{
    struct tm *day;
    time_t epoch,today;

    char buffer[25];
    memset(buffer,0,sizeof(buffer));   

    printf("str date in mmddyy function is %s\n",str);

    char mbuf[2],dbuf[2],ybuf[4];
    mbuf[0] = str[0];
    mbuf[1] = str[1];
    dbuf[0] = str[2];
    dbuf[1] = str[3];
    ybuf[0] = str[4];
    ybuf[1] = str[5];
    ybuf[2] = str[6];
    ybuf[3] = str[7];

    int m,d,y;
    m = atoi(mbuf);
    d = atoi(dbuf);
    y = atoi(ybuf);

    printf("m %d d %d y %d\n",m,d,y);

    time(&today);
    day = localtime(&today);
    day->tm_mon  = m-1;
    day->tm_mday = d;
    day->tm_year = y-1900;

    epoch = mktime(day);
    printf("epoch date is %ld\n",epoch);

    sprintf(buffer,"%ld",epoch);
    printf("epoch in string is %s\n",buffer);
    return buffer;
}

我收到了警告:

警告:函数返回局部变量的地址

我认为缓冲区超出了范围,有人能告诉我这个原因吗?

3 个答案:

答案 0 :(得分:0)

您没有得到不同结果的原因是:

一个。你每次都传递完全相同的值,并且 湾调用函数之间没有足够的时间来允许time()给你不同的秒数。

如果你想看到不同的结果,要么传入不同的日期值,要么使用某种方法来增加通话之间的时间:忙碌等待循环,或者其他任何“睡眠”。您的编译器提供的功能(Sleep或usleep;查找您的平台)。或者,如果您使用调试器逐步执行代码,则可以暂停一段时间,以便从time返回不同的时间。

你一定要开始调试器的事情;您希望熟悉它的工作原理,以帮助您找出遇到的未来问题。

答案 1 :(得分:0)

您的代码正在传递指向buffer的指针。但是一旦函数返回,buffer就不再存在。所以你的返回值是指向不再存在的东西的指针。您应该将该指针传递给printf

另外,这很奇怪:

malloc(sizeof(buffer));

您分配了一堆内存,大小与buffer的大小相等。但那么你什么都不做那种记忆呢?

您可能想要更改:

char buffer[25];
memset(buffer,0,sizeof(buffer));   // char *buffer = 
malloc(sizeof(buffer));

为:

char* buffer = malloc(25);
memset(buffer,0,25);

但你真的不需要memset。你将要在那里存储一个字符串,所以此时的值无关紧要。

答案 2 :(得分:0)

每次运行时,相同代码的相同输入将创建相同的输出。