如何使用指针初始化结构成员?

时间:2013-01-23 13:14:56

标签: c

我有以下代码。在下面的代码中,值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;
}

请帮帮我。

3 个答案:

答案 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;的复杂方法。

这样的行为会导致以下严重问题:

  1. 您刚刚在第4行分配了内存。现在,您使用指向堆栈变量的指针覆盖此指针。因此,您无法释放已分配的内存==>内存泄漏
  2. 退出作用域后,新指定的堆栈变量指针变为无效,并可能导致未定义的行为。
  3. 由于元素可能存在大小不匹配,对第6行后x元素的任何写入尝试都可能导致堆栈损坏(因而未定义的行为)。
  4. 第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);