c - C 中的嵌套结构和指针

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

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

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

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

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

最佳答案

下面一行并没有做它看起来做的事情:-)

*userdat->host = "127.0.0.1";

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

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

关于c - C 中的嵌套结构和指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15857413/

相关文章:

c - 错误: expected expression before 'struct'

c - 如何读取文本文件中的逗号分隔行并将其字段插入到结构指针数组中?

c - 在终止程序之前存储值

c - 人们一直告诉我我正在用 ruby​​ 写 "C style iterators",我应该用其他方式来做,没有 i++ 东西

c++ - GTK+ 如何处理指针?

c - 使用结构的矩阵

c - 如何开始为遗留嵌入式 C 应用程序编写单元测试 - 非常紧密耦合的模块?

c - 双重释放错误释放二维数组

c++ - 复制构造函数中的指针

c++ - 访问指针的速度