所以任何人都可以指出我在这里发生了什么,做这件事的正确方法是什么?
到get_time()
每次调用中的”最后一个术语返回相同的地址相同的缓冲,然后将其传递给printf()
,其中发现在这个一个缓冲了哪些放在最后,以“最后”时间”。
为了解决这个创建临时缓冲区传递给printf()
:
char * p1 = strdup(get_time(...));
char * p2 = strdup(get_time(...));
printf("\nStart-Time %s,End-Time %s", p1, p2);
/* Free the temporary buffers. */
free(p1);
free(p2);
,如果你知道get_time()
回报提前最大尺寸更简单的方法会做:
#define GET_TIME_LEN_MAX 32
...
char b1[GET_TIME_LEN_MAX];
char b2[GET_TIME_LEN_MAX];
strcpy(b1, get_time(...));
strcpy(b2, get_time(...));
printf("\nStart-Time %s,End-Time %s", b1, b2);
的后一个例子的安全版本:
#define GET_TIME_LEN_MAX 32
...
/* Define buffers and initialise them to ALL zeros. */
char b1[GET_TIME_LEN_MAX] = "";
char b2[GET_TIME_LEN_MAX] = "";
strncpy(b1, get_time(...), GET_TIME_LEN_MAX - 1);
strncpy(b2, get_time(...), GET_TIME_LEN_MAX - 1);
printf("\nStart-Time %s,End-Time %s", b1, b2);
由于strdup()
不是标准C,对于完整性找到低于本土实现:
#include <stdlib.h> /* for malloc() */
#include <string.h> /* for strcpy() */
char * strdup(const char * s)
{
char * p = NULL;
if (NULL != s)
{
p = malloc(strlen(s) + 1);
if (NULL != p)
{
strcpy(p, s);
}
}
return p;
}
来源
2015-11-30 17:24:58
alk
我敢打赌,你回本地字符数组(坏主意),但它是不可能知道,直到您发布实际的源代码。 – keithmo
也许你的get_time函数不是[reentrant](https://en.wikipedia.org/wiki/Reentrancy_(computing))。我们可以看到它的代码吗?你的get_time()存储它返回的字符串在哪里? – nos
get_time正在返回一个全局char数组。 char * get_time(int tval)//将时间以分钟为单位转换为小时 – TinTop