指向 struct tm 变量的指针,无法返回更改
pointer to struct tm variable, cannot give back the changes
我有一个简单函数的问题(我猜是因为一些错误的指针分配)。由于 strptime
函数(接受字符串并返回包含所有数据集的 struct tm
的函数)在 Windows 中不存在,我通过调用其他基创建了一种 strptime 函数工作职能。
这是测试代码。在 STRPTIME 函数中,时间设置得很好,然后在 main 中我丢失了信息。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
void STRPTIME(char *strtm, struct tm *tminfo)
{
time_t rawtime;
int day, month, year;
sscanf(strtm, "%d-%d-%d\n", &year, &month, &day);
time( &rawtime );
tminfo = localtime( &rawtime );
tminfo->tm_year = year - 1900;
tminfo->tm_mon = month - 1;
tminfo->tm_mday = day;
mktime(tminfo);
printf("date %d-%d-%d\n", tminfo->tm_year, tminfo->tm_mon, tminfo->tm_mday);
}
int main()
{
char stm[11];
struct tm tminfo;
strcpy(stm, "2015-12-31");
STRPTIME(stm, &tminfo);
printf("tminfo %d-%d-%d\n", tminfo.tm_year, tminfo.tm_mon, tminfo.tm_mday);
return(0);
}
问题是您正在覆盖 tminfo
参数的指针。
tminfo = localtime( &rawtime );
函数参数就像局部变量:您可以覆盖它。它存在于堆栈中。但是您的来电者不会注意到这一变化。
你需要做这样的事情:
// Store the result in a temporary variable.
struct tm * tmp = localtime( &rawtime );
if ( tmp && tminfo ) {
// Copy to caller's memory.
memcpy( tminfo, tmp, sizeof( *tmp ) );
}
我有一个简单函数的问题(我猜是因为一些错误的指针分配)。由于 strptime
函数(接受字符串并返回包含所有数据集的 struct tm
的函数)在 Windows 中不存在,我通过调用其他基创建了一种 strptime 函数工作职能。
这是测试代码。在 STRPTIME 函数中,时间设置得很好,然后在 main 中我丢失了信息。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
void STRPTIME(char *strtm, struct tm *tminfo)
{
time_t rawtime;
int day, month, year;
sscanf(strtm, "%d-%d-%d\n", &year, &month, &day);
time( &rawtime );
tminfo = localtime( &rawtime );
tminfo->tm_year = year - 1900;
tminfo->tm_mon = month - 1;
tminfo->tm_mday = day;
mktime(tminfo);
printf("date %d-%d-%d\n", tminfo->tm_year, tminfo->tm_mon, tminfo->tm_mday);
}
int main()
{
char stm[11];
struct tm tminfo;
strcpy(stm, "2015-12-31");
STRPTIME(stm, &tminfo);
printf("tminfo %d-%d-%d\n", tminfo.tm_year, tminfo.tm_mon, tminfo.tm_mday);
return(0);
}
问题是您正在覆盖 tminfo
参数的指针。
tminfo = localtime( &rawtime );
函数参数就像局部变量:您可以覆盖它。它存在于堆栈中。但是您的来电者不会注意到这一变化。
你需要做这样的事情:
// Store the result in a temporary variable.
struct tm * tmp = localtime( &rawtime );
if ( tmp && tminfo ) {
// Copy to caller's memory.
memcpy( tminfo, tmp, sizeof( *tmp ) );
}