取消引用指向不完整类型的指针。返回结构指针

时间:2016-10-15 11:14:17

标签: c pointers struct parameter-passing

我不明白我做错了什么。我想从函数内部传递一个结构指针以在外面使用它(我知道我可以传递整个结构但我想学习正确的用户指针)。

这是功能:

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)

3 个答案:

答案 0 :(得分:3)

您需要为malloc和time.h包含stdlib.htime.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