编写以下代码,从结构中输入时间并将它们一起打印成一个字符串:
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}}
答案 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)。
简单而标准的解决方案是将要填充的字符串作为参数传递给函数。