【发布时间】:2011-12-19 07:30:54
【问题描述】:
我在打印从函数返回的结构成员时遇到问题:
#include <stdio.h>
struct hex_string
{
char a[9];
};
struct hex_string to_hex_string_(unsigned x)
{
static const char hex_digits[] = "0123456789ABCDEF";
struct hex_string result;
char * p = result.a;
int i;
for (i = 28; i >= 0; i -= 4)
{
*p++ = hex_digits[(x >> i) & 15];
}
*p = 0;
printf("%s\n", result.a); /* works */
return result;
}
void test_hex(void)
{
printf("%s\n", to_hex_string_(12345).a); /* crashes */
}
to_hex_string_ 内部的printf 调用打印正确的结果,但test_hex 内部的printf 调用使我的程序崩溃。为什么会这样?这是一生的问题,还是其他问题?
当我将 printf 调用替换为 puts(to_hex_string_(12345).a) 时,出现编译器错误:
invalid use of non-lvalue array
这是怎么回事?
【问题讨论】:
-
@LuchianGrigore:这是未定义行为的一种可能症状。
-
您的源文件顶部是否有
#include <stdio.h>?为什么函数名后面有下划线? (这是合法的,但很奇怪。) -
@KeithThompson:是的,包括
stdio.h。如果我已经有一个同名的稳定函数,尾随下划线是我个人对一次性玩具函数的约定。 -
我已将
#include <stdio.h>添加到问题中。在某些情况下(不是这个),缺少#include指令可能是问题的原因。
标签: c arrays struct return-value lvalue