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

3

我花了很长时间试图找出以下程序的问题所在:

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);
}

程序非常简化,以突出相关部分。情况是第一个打印语句(//1)可以正确输出值,而第二个打印语句(//2)无法输出正确的值 - 它输出了一些类似于可能的内存位置的东西。
我尝试了许多访问存储变量的组合,但我就是搞不定它。任何帮助将不胜感激。
编辑1:修正了代码中的一些非必要错误(与指针或结构体无关)
最终编辑:谢谢大家的帮助。Arun Saha指出的问题确实存在于原始代码中,现在已经解决。然而,打印两个不同字符串的问题仍然存在。你们对代码应该能够编译和工作的保证导致我发现了真正的罪魁祸首 - 我没有正确初始化复杂结构的另一部分,这导致了用户.order变量的覆盖。

2
datname 在主函数中是什么? - Arun
1
更不用说 init_user() 了。 - chris
1
感谢您尝试简化代码以说明问题。但是,非常重要的一点是,在这样做时,您需要编译代码以确保不会引入其他错误。请编译并清理任何编译器错误,以便我们可以帮助您解决真正的问题。 - Code-Apprentice
抱歉,init_user 应该是 init_userdata,datname 是文件的名称。我已经编辑了代码。 - Matic
1
请确保您的 fscanf() 调用成功。并且请确保您的代码可以编译(例如使用 /* ... */// ... 表示缺失的代码)。请了解如何创建 SSCCE(简短、自包含、正确的示例)。在提交代码之前,请确保您的代码可以干净地编译,或者将您的问题描述为“如何修复这个编译警告”。请记住,此时您的编译器比您更了解 C 语言。相信它;它比您更有可能是正确的。(相信我,我也相信编译器会在我犯傻的时候告诉我!) - Jonathan Leffler
2个回答

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
你说得对,那段代码并没有达到预期的效果。更糟糕的是,它应该会产生编译警告(关于将指针分配给char或类似的问题)。在提交之前,请确保你的代码可以干净地编译,或者明确要求帮助解决特定的警告问题。(@user2253444) - Jonathan Leffler

1
在您的main函数中,当您调用read_user (datname, &dat->userdat);时,我感觉应该会出现编译问题。实际上,这应该是read_user (datname, &dat.userdat);,因为dat不是指针,而是一个对象本身。
通过这个更改和Arun之前的建议,我已经尝试了您的程序,它可以工作。

感谢您指出这一点。在我为了在这里展示而简化代码时,引入了错误。 - Matic

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接