c - 打印返回结构的成员

标签 c arrays struct return-value lvalue

我在打印从函数返回的结构成员时遇到问题:

#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 调用使我的程序崩溃.为什么会这样?是一辈子的事,还是别的?

当我用 puts(to_hex_string_(12345).a) 替换 printf 调用时,出现编译器错误:

invalid use of non-lvalue array

这是怎么回事?

最佳答案

C 中有一条很少生效的规则,它指出:

If an attempt is made to modify the result of a function call or to access it after the next sequence point, the behavior is undefined. (C99 §6.5.2.2)

在这种情况下,在评估 printf() 的参数之后和执行 printf() 函数本身之前有一个序列点。您传递给 printf() 的指针是一个指针指向返回值本身的一个元素 - 当 printf() 尝试访问穿过那个指针,你就会崩溃。

这个问题很难遇到,因为函数值不是左值,所以您不能直接使用 & 获取指向它的指针。

关于c - 打印返回结构的成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7963813/

相关文章:

Javascript - 如何从所有开始和结束字符串匹配实例中创建一个数组 - 在字符串中找到

使用 qsort 对 C 数组进行排序?

c# - 如何在 C# 中将两个结构类型变量链接在一起?

c - Gtk-关键 ** : IA__gtk_widget_get_parent: assertion `GTK_IS_WIDGET (widget)' failed

c - 如何逐帧在视频上应用线段检测器 (LSD)?

c++ - 宏 C 中的字符串连接

struct - 在 Map<..,struct> 中分配结构体的值字段会删除未指定的值

c - 在这个程序中,语句 "i is 1"应该在我输入值 2 之前而不是之后打印。?

java - 难倒: Detect identical sequence of integers in two integer arrays

c - 初始化位域