看红色字就行
对于 int *p = (int *)malloc(sizeof(int));
这种定义方式,涉及到两个方面:指针 p
本身的内存占用和动态分配的内存。
-
指针
p
的内存占用:- 在32位系统上,指针
p
占用4个字节。 - 在64位系统上,指针
p
占用8个字节。
指针
p
的大小与它指向的数据类型无关,只与系统架构有关。 - 在32位系统上,指针
-
动态分配的内存:
malloc(sizeof(int))
动态分配了一块内存,大小是一个int
的大小。- 在大多数系统上,
int
通常占用4个字节,因此malloc(sizeof(int))
分配了4个字节的内存。
动态分配的这块内存由指针
p
指向,但它的大小独立于指针p
本身的大小。
完整的理解如下:
int *p = (int *)malloc(sizeof(int));
p
是一个指针,指向int
类型。p
本身占用的内存大小:- 在32位系统上是4个字节。
- 在64位系统上是8个字节。
malloc(sizeof(int))
分配了一块足够存储一个int
的内存。- 通常,这块内存大小为4个字节(假设
int
是4个字节)。
- 通常,这块内存大小为4个字节(假设
p
被初始化为指向这块动态分配的内存。
总结:
- 指针
p
本身的大小取决于系统架构,与它指向的数据类型无关。 - 动态分配的内存大小由
malloc
的参数决定,在这个例子中是sizeof(int)
,通常是4个字节。
因此,int *p = (int *)malloc(sizeof(int));
中,指针 p
和动态分配的内存各自占用的大小如下:
- 指针
p
:- 32位系统上:4个字节。
- 64位系统上:8个字节。
- 动态分配的内存:
- 通常是4个字节(假设
int
是4个字节)。
- 通常是4个字节(假设
无论指针指向的数据类型是什么,在一个给定的系统中,指针的大小都是固定的,与数据类型无关。这包括指向结构体的指针。
假设有如下结构体定义:
struct node {
int x;
int y;
};
struct node *p;
在这个例子中:
-
struct node
的大小:结构体struct node
包含两个int
类型的成员。在大多数系统上,int
类型通常占用4个字节。因此,struct node
的大小一般是8个字节(两个int
各占4个字节)。当然,这还可能受结构体内存对齐(padding)的影响,但这里先不考虑对齐问题。 -
struct node *p
的大小:指针p
是一个指向struct node
类型的指针。在32位系统上,指针通常占用4个字节;在64位系统上,指针通常占用8个字节。指针的大小与它指向的数据类型无关。
因此,对于 struct node *p
:
- 在32位系统上,
p
指针占用4个字节的内存。 - 在64位系统上,
p
指针占用8个字节的内存。
总结起来,无论指针指向什么类型的数据(包括基本数据类型和结构体),指针本身的大小只取决于系统的架构(32位或64位),而不取决于它指向的数据类型。