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) 则没有 - 它输出的东西看起来像是一个可能的内存位置。

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

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

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

4

2 回答 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 );
于 2013-04-07T00:15:48.093 回答
1

在你的main函数中,当你调用时read_user (datname, &dat->userdat);,我觉得应该有一个编译问题。这实际上应该read_user (datname, &dat.userdat);不是dat指针,而是对象本身。

有了这个改变和 Arun 之前的建议,我已经尝试了你的程序并且它可以工作。

于 2013-04-07T00:32:42.353 回答