-2

我有以下代码。在下面的代码中,值5存储在变量a(即abc.a)中。但我想初始化c(即abc.c)中的值。怎么做?我的要求是为cnot for填写数据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;
}

请帮我。

4

3 回答 3

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 元素的写入尝试都可能导致堆栈损坏(因此导致未定义的行为)。

到第 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;
}
于 2013-01-23T13:46:48.867 回答
0

你问这个:

abc s;
s.c = 5;

这使得c5. 或者你可以这样做:

abc s = {0,0,5};

这意味着,前两个成员被初始化为0,第三个成员(即c)被初始化为5

或者,如果你有指针,那么你可以这样做:

abc *p = malloc(etc);
p->c = 5;

但随后避免使用指针和malloc. 当你真正需要它们时使用它。在您的代码中,我看不出您需要它的任何理由。使用自动变量,而不是指针。

于 2013-01-23T13:17:44.010 回答
0

我认为您需要在返回 main() 之前添加它以获得所需的内容。

ab->c = *(x->pointer);
于 2013-01-23T13:44:51.993 回答