将结构指针传递给C中的函数时出现奇怪的错误

时间:2017-04-01 15:39:36

标签: c function pointers struct

我写了一个简单的C测试程序来练习使用结构。但是我无法理解代码有什么问题;似乎整数或双字段的第一个打印输出清除了两个字段。这里我的错误是什么?

代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct Dummy {
    int i;
    double d;
    char s[8];
};

void print(struct Dummy *dummy) {
    printf("%lf ", dummy->d);
    printf("%lf ", dummy->d);
    printf("%d ", dummy->i);
    printf("%s\n", dummy->s);
}

void set(struct Dummy **dummy) {
    struct Dummy duh;
    duh.i = 1;
    duh.d = 3.14;
    strcpy(duh.s, "Hello!");
    *dummy = &duh;
}

int main(int argc, char **argv) {
    struct Dummy *dummy;
    set(&dummy);
    print(dummy);
    return 0;
}

其输出:

3.140000 0.000000 0 Hello!

非常感谢!

2 个答案:

答案 0 :(得分:3)

您通过在set中分配局部变量的地址并返回它来调用未定义的行为。

*dummy = &duh;
duh返回后

set不再有效。

答案 1 :(得分:0)

在set中,您将** dummy分配给变量duh,该变量在函数范围内定义。这意味着即使你保留指针,duh也会在函数结束时丢失。 要更正直接指定函数的参数

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct Dummy {
    int i;
    double d;
    char s[8];
};

void print(struct Dummy *dummy) {
    printf("%lf ", dummy->d);
    printf("%lf ", dummy->d);
    printf("%d ", dummy->i);
    printf("%s\n", dummy->s);
}

void set(struct Dummy *dummy) {
    dummy->i = 1;
    dummy->d = 3.14;
    strcpy(dummy->s, "Hello!");
}

int main(int argc, char **argv) {
    struct Dummy dummy;
    set(&dummy);
    print(dummy);
    return 0;
}