我不明白我做错了什么。我想从函数内部传递一个结构指针以在外面使用它(我知道我可以传递整个结构但我想学习正确的用户指针)。
这是功能:
struct tm* GetActualTime()
{
//VAR DECLARE
time_t rawtime;
struct tm *timeinfo=malloc(sizeof(struct tm));
time ( &rawtime );
timeinfo = localtime ( &rawtime );
return timeinfo;
}
这就是我在main中所说的:
int main(void){
struct tm *real_time;
real_time=GetActualTime();
printf("%d:%d%d",real_time->tm_hour,real_time->tm_min,real_time->tm_sec);
}
我收到错误:
dereferencing pointer to incomplete type
我已经找到了这个错误,我知道有更多的线程,但它只引用了一些问题,例如:错误的结构声明(我觉得它不是问题,因为它是一个结构来自time.h lib)或坏调用(而不是rea)
答案 0 :(得分:3)
您需要为malloc和time.h包含stdlib.h
和time.h
文件,stdlib.h
以获取与时间相关的功能。这个包含程序运行成功..我已经检查过,它给出了正确的输出。
答案 1 :(得分:0)
你没事,我在另一个.c文件中调用lib,但我在main中使用它,但由于我没有得到lib错误,我总是认为我的代码错了,我错过了一些关于指针。
我很抱歉浪费你的时间并感谢你帮助解决问题。 最诚挚的问候。
答案 2 :(得分:0)
以下代码输出正确的时间。
请注意对printf()
请注意,来自localtime()
的数据将被复制到已分配的内存
注意函数的使用:memcpy()
而不是strncpy()
,因为struct tm
中的某些字节将是0x00,这会阻止strncopy()
函数复制所有数据
注意分配的内存在完成后会传递给free()
。
请注意#include
语句
注意代码的一致缩进:I.E。在每个开口支架后缩进' {'。在每个闭幕式之前都是无意义的'}。我为每个缩进级别使用了4个空格,因为它足够宽,即使使用可变宽度字体也可以看到。永远不要使用制表符作为缩进,因为每个字处理器,编辑器的制表符/制表符宽度设置不同。
注意:如果函数:struct tm* GetActualTime()
与包含main()
函数的文件位于一个单独的文件中,那么应该有一个“自己种植的”文件。头文件(你写的一个),包含函数的原型。该头文件应该是包含#include
函数的文件中的main()
d。
这样的头文件看起来像这样:
#ifndef GETACTUALTIME_H
#define GETACTUALTIME_H
#include <time.h> // struct tm
struct tm *GetActualTime( void );
#endif // GETACTUALTIME_H
现在,代码:
#include <stdio.h> // printf()
#include <stdlib.h> // malloc(), free()
#include <time.h> // time(), localtime(), time_t, struct tm
#include <string.h> // memcpy()
struct tm* GetActualTime()
{
//VAR DECLARE
time_t rawtime;
struct tm *timeinfo=malloc(sizeof(struct tm));
time ( &rawtime );
memcpy(timeinfo, localtime(&rawtime), sizeof(struct tm) );
return timeinfo;
} // end function: GetActualTime
int main(void)
{
struct tm *real_time;
real_time=GetActualTime();
printf("%d:%d:%d",real_time->tm_hour, real_time->tm_min, real_time->tm_sec);
free( real_time );
} // end function: main