1

我看到了下面写的代码。

typedef struct abc {
    int a;
    char b;
    float c;
} abc;

int main()
{
  abc *ab;
  int *i;
  i = (int*)malloc(sizeof(int));
  *i = 0;
  ab = (abc*) i;

  return 0;
}

在倒数第二行ab = (abc*) i;,代码试图做什么?

如果我们要设置 的值ab->a,那为什么要这样做,而不是:

ab->a = (int)i;

如果ab = (abc*) i;更新 的值ab->a,那么其他两个结构成员将如何在不单独初始化它们的情况下进行初始化?

4

5 回答 5

4

那么其他两个结构成员将如何在不专门初始化它们的情况下被初始化呢?

他们不会。

你会得到垃圾值ab->bab->c因为i它不代表一块足够大的内存来代表abc.

ab->a等于 0,因为当您执行: 时*i = 0,您将值存储在指向0的内存位置中。i当您abc指向与 相同的内存位置时i,没有对内存进行任何写入,您只是更改了数据的位置。

由于0之前在i指向的位置存储了 4 个字节,并且由于int ab::a恰好占用了 4 个字节并且也恰好是结构的第一个成员,因此ab->a将等于 0。

在内存中,相对于实例的位置,您的结构的顺序如下:

 ____ ____ ____ ____    ____    ____ ____ ____ ____
| 00 | 01 | 02 | 03 |  | 04 |  | 05 | 06 | 07 | 08 |
|____|____|____|____|  |____|  |____|____|____|____|
        int a          char b         float c

我希望这能解决问题。

注意
你并不能真正保证结构完全打包,就像我在上面的表示中所做的那样。虽然将保留顺序,但连续成员之间的空间并不总是 0 内存地址单元。阅读对齐

于 2013-03-29T07:36:31.557 回答
3

该行将typeab = (abc*) i;的指针变量强制转换为 type ,并将该赋值给指针变量。但是,这当然不是您想要初始化结构中数据成员的方式,特别是因为只为 an分配了足够的空间,而且我们使用的结构占用的空间比.iint*abc*abintint

归根结底,这是法律法规,但非常可怕。我什至不确定您是否可以保证将数据成员int a存储在ab. 我想说它依赖于实现,但也许其他人可以为我解决这个问题。

于 2013-03-29T07:38:01.820 回答
2

倒数第二行导致从(int *)to的转换(abc *),并将结果分配给 ab。这不是一个很好的代码行,因为旧的指向类型比新的指向类型小;使用此转换结果的一些尝试将是未定义的行为。将其保留为(int *),或声明要转换为的前缀结构将是一个更好的主意。

The * in abc * indicates that the type is a "pointer to abc". ab doesn't point to an abc object until you tell it to point to one. ab = /* something */ assigns ab to point to something. ab = malloc(sizeof *ab); would make sense, in this example.

This is silly: i = (int*)malloc(sizeof(int));. You don't need to cast the return value of malloc. The only justifiable reason for this is that the author of this code has neglected to #include <stdlib.h>. I suggest including that library, rather than casting the return value. You can feel free to ignore my advice, but don't ask any questions about strange errors until you've read this page.

于 2013-03-29T07:43:54.807 回答
1

abc *ab;ab 是 struct abc 类型的指针; int *i;是一个指向 int 返回的指针malloc

它的值是使用设置的*i = 0;

ab = (abc*) i;

此行将 malloc 分配的位置地址分配给 ab。通过对它进行类型转换i(abc*)表明 ab 将用于读取大小为struct abc ab = (abc*) i; 为 a 赋值的内存块。给 au 赋值就可以了ab->a = 5;

已经存在的值是垃圾值(默认随机值)

于 2013-03-29T07:39:04.343 回答
-2
ab = (abc*) i; updates the value of ab->a

如果我们看结构布局,int 是 int 是第一个成员,所以它将被初始化为 0,所以 ans 是的!我尝试使用 VC 并将其初始化为 0,但这很棘手,如果是 struct if member change order 那么你就抢到了!

还有内存泄漏,使用 malloc 分配的内存从未释放!

于 2013-03-29T07:40:39.350 回答