gpt4 book ai didi

c - 我的程序输出未在 C 中更新

转载 作者:太空宇宙 更新时间:2023-11-04 06:16:50 25 4
gpt4 key购买 nike

下面是我的 C 代码,有一次它工作正常,再次调用该函数后,它给出了相同的结果。缓冲区未更新。

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

char *EpochToMMDDYYYY(long );

int main() {
long epoch = 1492151737;
printf("date of %ld is %s\n",epoch,EpochToMMDDYYYY(epoch));
long ep = 1492222737;
printf("date of %ld is %s\n",epoch,EpochToMMDDYYYY(ep));
long epc = 1491111737;
printf("date of %ld is %s\n",epoch,EpochToMMDDYYYY(epc));
return 0;

}

char *EpochToMMDDYYYY(long ep)
{
struct tm tm;
char b[25];
memset(b,0,sizeof(b));
//setenv("TZ", "PST8PDT", 1);
/* set your own time zone PST8PDT for PDT timezone */
//tzset();

char epoch[20];
sprintf(epoch,"%ld",ep);

memset(&tm, 0, sizeof(struct tm));
strptime(epoch, "%s", &tm);
strftime(b, sizeof(b), "%m%d%Y", &tm);
puts(b); /* -> 04 24 2017 */
return b;
}

输出如下

04142017
date of 1492151737 is 04142017
04142017
date of 1492151737 is 04142017
04022017
date of 1492151737 is 04022017

谁能告诉我这背后的原因和解决方案?

最佳答案

您正在返回一个指向函数中本地保存的内存的指针:

char *EpochToMMDDYYYY(long ep) {
char b[25];
...
return b;
}

当函数返回时,b 超出范围并且不再有效。访问此类内存会导致未定义的行为,而此类可能的未定义行为可能会产生您的输出。

为了克服这个问题,我看到了两种方法:

首先,您可以将局部变量 b 更改为静态变量,即 char b[25]; --> static char b[25] 按照 BLUEPIXY 的建议。但是请注意,稍后的调用会覆盖先前调用的结果。如果未同时复制或最终使用结果,这可能会出现问题:

printf("%s %s", EpochToMMDDYYYY(epoch), EpochToMMDDYYYY(ep))

这将打印相同的值两次,甚至未指定是哪一次。

因此,其次,我实际上建议将写入结果的内存作为函数参数传递给它。更改代码如下:

void EpochToMMDDYYYY(long, char*);

int main() {
char result[25];

long epoch = 1492151737;
EpochToMMDDYYYY(epoch, result);
printf("date of %ld is %s\n",epoch,result);

long ep = 1492222737;
EpochToMMDDYYYY(ep, result);
printf("date of %ld is %s\n",epoch,result);

...
return 0;

}

void *EpochToMMDDYYYY(long ep, char* b) {
...
}

关于c - 我的程序输出未在 C 中更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43689875/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com