C语言中访问嵌套联合内结构体成员的问题求助
解决嵌套结构体联合的成员访问问题
嗨,我来帮你搞定这个问题!你的代码里有两个核心错误,咱们一步步拆解:
1. 指针访问结构体成员用错了运算符
你定义的n是node_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




