

-
INT4 * p1
的本质 : 需要在内存找个位置放地址
请给我在内存找个地儿
放得下一个地址就行了
其实我不管前面的是 INT4 还是 HELLO4
只要这个【类型】是你编译器可以读出来的就行
具体这个【类型】有多大都好、有再大都好
反正现在就给点空间能放得下一个地址就行
-
p1= (INT4 *) malloc (sizeof(INT4));
的本质 : 需要在内存真正开辟空间放【类型】
为4个一组的int变量,申请动态分配四次
malloc(sizeof(int))
malloc(sizeof(int))
malloc(sizeof(int))
malloc(sizeof(int))
当然可以也可以是 malloc(sizeof(int) * 4)
那么为什么不能直接写
p1 = (int *) malloc(sizeof(int) * 4) 呢?
【在这里】当然可以这么写了,因为毕竟,
结构体INT4的第一个变量就是 int a,
恰好就是一个整型变量,并且恰好4个变量都是 int 变量;
这是我故意凑出来的例子。
【但是请想想看INT3_CHAR1】
对于一般的结构体而言,真实的情况是,
大部分的变量类型都不会完全一样的,
不会总是4个int一组,或者4个char一组,
如果真是这样,为什么不直接用数组呢,
结构体本来就适合各种各样类型的组合在一起。
- 其实,不管
INT4
本质是不是4个int变量一组,直接写sizeof(结构体类型)
并且 进行强制转换(结构体 *)
,无论如何都一步到位,不会再错了,这就是 为什么要用 malloc(sizeof(结构体类型));
结构体 * 指针 = ( 结构体 *) malloc( sizeof(结构体) ) ;
p1= (INT4 *) malloc (sizeof(INT4));
p2 = (INT3_CHAR1 *) malloc (sizeof(INT3_CHAR1));
-
INT3_CHAR1
还是为了说明:结构体为了地址的对齐,会自动补充字节
完整源码
#include <stdio.h>
#include <stdlib.h>
typedef struct int4 {
int a;
int b;
int c;
int d;
} INT4;
typedef struct int3_char1 {
int a;
int b;
char c;
int d;
} INT3_CHAR1;
int main()
{
INT4 * p1;
p1= (INT4 *) malloc (sizeof(INT4));
printf("sizeof(INT4): %d\n", sizeof(INT4));
printf("&p1:%p\np1:%p\n", &p1, p1);
printf("INT4\na:%p\nb:%p\nc:%p\nd:%p\n"
,&(p1->a),&(p1->b),&(p1->c),&(p1->d));
INT3_CHAR1 * p2;
p2 = (INT3_CHAR1 *) malloc (sizeof(INT3_CHAR1));
printf("sizeof(INT3_CHAR1): %d\n", sizeof(INT3_CHAR1));
printf("&p2:%p\np2:%p\n", &p2, p2);
printf("INT3_CHAR1\na:%p\nb:%p\nc:%p\nd:%p\n"
,&(p2->a),&(p2->b),&(p2->c),&(p2->d));
return 0;
}
网友评论