C语言中的嵌套结构和指针

时间:2013-04-07 00:09:31

标签: c pointers struct nested

我花了很多年时间试图找出以下程序的问题:

typedef struct user {
    char host[40];
    int order;
} user;

typedef struct data {
    user userdat;
} data;

int read_user (char *datname, user *userdat) {
    ...

    fscanf (datin, "%s", &userdat->host);
    fscanf (datin, "%d", &userdat->order);

    //1
    printf ("%d\n", userdat->order);

    ...

}

void init_data (data *dat) {
    init_userdat (&dat->userdat);
}

void init_userdat (user *userdat) {
    *userdat->host = "127.0.0.1";
    userdat->order = 0;
}

int user_print (int i, data *dat) {
    //2
    printf ("%d\n", dat->userdat.order);
}

int main(int argc, char *argv[]) {

    ...
    data dat;
    init_data (&dat);
    read_user (datname, &dat->userdat);
    user_print (&dat);
}

该程序非常简化,以突出显示相关部分。会发生的是第一个print语句(// 1)正确输出值,而第二个(// 2)没有输出 - 它输出的内容看起来像一个可能的内存位置。

我尝试了很多访问存储变量的组合,但我无法破解它。任何帮助将不胜感激。

Edit1:修复了代码中的几个非必要错误(与指针或结构无关)

最终编辑:谢谢大家的帮助。 Arun Saha指出的问题确实存在于原始代码中,现在已经修复。但是,打印两个不同字符串的问题仍然存在。你保证代码应该编译和工作,这让我发现了真正的罪魁祸首 - 我没有正确地初始化其他复杂结构的另一部分,这导致覆盖了user.order变量。

2 个答案:

答案 0 :(得分:2)

以下行不会执行以下操作: - )

*userdat->host = "127.0.0.1";

userdata->host是指向host[40]数组中第一个字符的指针。上述语句只会复制源字符串中的一个字符(" 127.0.0.1")。要复制整个字符串,请使用标准库函数stncpy()

strncpy( & userdata->host[ 0 ], "127.0.0.1", 40 );

答案 1 :(得分:1)

main函数中,当您调用read_user (datname, &dat->userdat);时,我觉得应该存在编译问题。这应该是read_user (datname, &dat.userdat);,因为dat不是指针,而是对象本身。

通过此更改和Arun之前的建议,我已经尝试了您的程序并且可以正常运行。