我有以下代码。在下面的代码中,值5
存储在变量a
中(即abc.a
)。但我想初始化c
中的值(即abc.c
)。怎么做?我的要求是填写c
的数据而不是a
。
typedef struct abc
{
int a;
int b;
int c;
}abc;
typedef struct def{
int *ptr;
abc strpt;
}def;
typedef struct xyz{
int *pointer;
}xyz;
int main()
{
int *temp, tmp;
abc* ab;
tmp = 5;
temp = &tmp;
ab = (abc*)malloc(sizeof(abc));
xyz *x = (xyz*)malloc(sizeof(xyz));
def *de = (def*)malloc(sizeof(def));
x->pointer = (xyz*)temp;
ab = (abc*)x->pointer;
return 0;
}
请帮帮我。
答案 0 :(得分:2)
我很害怕你的代码中出现了一些严重缺乏理解指针的内容。让我逐行剖析,以明确问题发生的地方。
我对这些语句进行了编号,以便进行简单的引用,假设类型声明如上所述。
int main()
{
int *temp, tmp;
abc* ab;
/* 1 */ tmp = 5;
/* 2 */ temp = &tmp;
/* 3 */ ab = (abc*)malloc(sizeof(abc));
/* 4 */ xyz *x = (xyz*)malloc(sizeof(xyz));
/* 5 */ def *de = (def*)malloc(sizeof(def));
/* 6 */ x = (xyz*)temp;
/* 7 */ ab = (abc*)x;
return 0;
}
首先:你永远不会清理在3,4和5中分配的内存。即使是一个简单的测试程序,你也应该总是照顾这样的东西。
你的第一个问题是第6行,你盲目地将指向int类型的对象(内存中的4个字节)的指针转换为指向xyz类型结构的指针(内存中4或8个字节,不同类型)。你在这里做的是写x = (xyz*)&tmp;
的复杂方法。
这样的行为会导致以下严重问题:
第7行你再次遇到同样的问题甚至更糟。估计的sizeof(abc)可能是12个字节。在此行之后访问abc的任何元素可能会再次导致堆栈损坏。
我仍然不明白你真正想要的是什么,但如果你“必须”通过指针初始化一个结构元素,有几种方法:
如果结构已知,你可以这样做: abc * ab = malloc(sizeof(abc));
if (ab != NULL) {
ab->c = 5;
// -- do other stuff
free(ab); ab = NULL;
}
如果你需要一个指向元素'c'的指针,你可以这样做:
int * c_ptr = NULL;
abc * ab = malloc(sizeof(abc));
if (ab != NULL) {
c_ptr = &(ab->c);
*c_ptr = 5;
//-- do other stuff
free(ab); ab = NULL;
}
答案 1 :(得分:0)
你是否要求这样做:
abc s;
s.c = 5;
这使得c
5.或者你可以做到:
abc s = {0,0,5};
这意味着,前两个成员初始化为0
,第三个成员(c
)初始化为5
。
或者如果你有指针,那么你可以这样做:
abc *p = malloc(etc);
p->c = 5;
然后避免使用指针和malloc
。当真正需要它们时使用它。在您的代码中,我没有看到您需要它的任何理由。使用自动变量,而不是指针。
答案 2 :(得分:0)
我认为你需要在main()中返回之前添加它以获得你需要的东西。
ab->c = *(x->pointer);