我写了一个简单的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!
非常感谢!
答案 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;
}