如何从c中的函数指针返回类型char

时间:2017-11-01 07:05:14

标签: c string char function-pointers return-type

编写以下代码,从结构中输入时间并将它们一起打印成一个字符串:

char *(*standard_time)(struct time *self);

但是,它无法打印出结果,因为返回类型似乎并不兼容。

将类型更改为指针并没有修复它:

结构中的

char *standard_time_format(struct time *self)

功能:

char *str = &standard_format;

并在两个例程中创建指向standard_format的指针:

return(str);

并返回函数中的指针:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct time
{
    int hour;
    int minute;
    char am_pm [3];
    void (*standard_time)(struct time *self, char standard_format[8]);
};

void standard_time_format(struct time *self, char standard_format[8])
{
    char conversion[3];

    snprintf(conversion, sizeof(conversion), "%d", self->hour);
    strcpy(standard_format, conversion);

    strcat(standard_format, ":");

    snprintf(conversion, sizeof(conversion), "%d", self->minute);
    strcat(standard_format, conversion);

    strcat(standard_format, self->am_pm);
}

int  main()
{
    struct time start;
    char standard_format[8];

    start.hour = 2;
    start.minute = 34;
    strcpy(start.am_pm, "am");
    start.standard_time = standard_time_format;

    start.standard_time(&start, standard_format);
    printf("%s\n", standard_format);

    return 0;
}

那么返回的是什么类型,以及如何正确访问它以在printf命令中显示它?

修改

正如答案中所建议的那样,我修改了代码,以便将字符串作为参数传递给函数,从而解决了这个问题。以下是更新后的代码:

{{1}}

2 个答案:

答案 0 :(得分:0)

return(standard_format);

这里,当standard_time_format返回其堆栈时,返回指向局部变量的指针将被释放,并且最终返回的standard_format将变为无效

您应该将char数组传递给standard_time_format并复制要在其中返回的字符串,而不是返回本地变量

答案 1 :(得分:0)

执行时standard_time_format功能

return(standard_format);

您尝试返回指向数组standard_format中第一个元素的指针(请记住,数组衰减指向其第一个元素的指针,即&standard_format[0])。它的类型是char *

然而 这是非常有问题的,因为standard_format是函数内的局部变量,它将超出范围一旦执行了return语句,就会留下一个悬空指针,您无法解除引用(尝试这样做会导致undefined behavior)。

简单而标准的解决方案是将要填充的字符串作为参数传递给函数。