You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

C语言中访问嵌套联合内结构体成员的问题求助

解决嵌套结构体联合的成员访问问题

嗨,我来帮你搞定这个问题!你的代码里有两个核心错误,咱们一步步拆解:

1. 指针访问结构体成员用错了运算符

你定义的nnode_t*类型的指针,直接用.访问成员是不对的——.是用来访问直接的结构体变量的成员,而指针指向的结构体成员需要用->运算符。

所以正确的访问方式应该是:

n->command.program

而不是你写的n.command.program

2. C语言里不能用==比较字符串内容

==在C里比较的是两个字符串指针的内存地址,而不是字符串的实际内容。哪怕两个字符串内容完全一样,只要它们存在不同的内存地址,==就会返回假。

要比较字符串内容,你需要用标准库的strcmp函数(记得包含<string.h>头文件),当两个字符串相等时,strcmp会返回0

if (strcmp(n->command.program, "cd") == 0) {
    printf("cd command entered\n");
}

额外的安全提示:先判断节点类型再访问联合成员

因为联合的所有成员共享同一块内存空间,如果你在节点类型不是command的时候访问command成员,会触发未定义行为(读到错误的内存数据)。所以访问联合成员前,一定要先通过type枚举判断当前节点的类型:

// 假设你的enum node_type里有个COMMAND类型的枚举值
if (n->type == COMMAND) {
    if (strcmp(n->command.program, "cd") == 0) {
        printf("cd command entered\n");
    }
}

修正后的完整示例代码

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

// 补全枚举定义(根据你的实际情况调整)
enum node_type { COMMAND, PIPE, REDIRECT, SUBSHELL, DETACH, SEQUENCE };
enum redirect_type { REDIRECT_IN, REDIRECT_OUT };

struct tree_node; 
typedef struct tree_node node_t; 
struct tree_node { 
    enum node_type type; 
    union { 
        struct { 
            char *program; 
            char **argv; 
            size_t argc; 
        } command; 
        struct { 
            node_t **parts; 
            size_t n_parts; 
        } pipe; 
        struct { 
            node_t *child; 
            int fd; 
            enum redirect_type mode; 
            union { 
                int fd2; 
                char *target; 
            }; 
        } redirect; 
        struct { 
            node_t *child; 
        } subshell; 
        struct { 
            node_t *child; 
        } detach; 
        struct { 
            node_t *first; 
            node_t *second; 
        } sequence; 
    }; 
};

int main() {
    // 初始化一个有效的command节点示例
    node_t *n = malloc(sizeof(node_t));
    if (!n) return 1;
    
    n->type = COMMAND;
    n->command.program = "cd";
    
    if (n->type == COMMAND) {
        if (strcmp(n->command.program, "cd") == 0) {
            printf("cd command entered\n");
        }
    }
    
    free(n);
    return 0;
}

内容的提问来源于stack exchange,提问作者Umar

火山引擎 最新活动