我的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;
}
我收到了警告:
警告:函数返回局部变量的地址
我认为缓冲区超出了范围,有人能告诉我这个原因吗?
答案 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)
每次运行时,相同代码的相同输入将创建相同的输出。