假设一个结构体大小40 给这个结构体的指针malloc 为什么这个指针的sizeof是8而不是40
时间: 2023-11-04 21:23:22 浏览: 106
这是因为`sizeof`是一个编译时运算符,它返回的是一个类型或变量所占用的字节数,而不是指针所指向的内存块大小。在32位编译器中,一个指针占用4个字节,在64位编译器中,一个指针占用8个字节。因此,对于一个通过`malloc`函数分配的内存块,返回的指针的`sizeof`值为指针类型所占用的字节数,而不是分配的内存块大小。
如果你想获取通过`malloc`分配的内存块的大小,可以使用`sizeof`运算符对结构体类型进行操作,或者使用`malloc_usable_size`函数来查询指针所指向的内存块大小。例如:
```
struct Person {
char name[20];
int age;
};
struct Person* p = (struct Person*)malloc(sizeof(struct Person));
printf("%lu\n", sizeof(struct Person)); // 输出 24
printf("%lu\n", malloc_usable_size(p)); // 输出 40
```
在这个例子中,`sizeof(struct Person)`返回的是结构体类型`Person`所占用的字节数,为24,而`malloc_usable_size`函数返回的是通过`malloc`函数分配的内存块大小,为40。
相关问题
malloc结构体指针指向
malloc函数可以用来动态的分配内存。结构体指针可以通过malloc函数分配适当大小的内存空间,并将其返回给指针。这样,结构体指针就可以指向该内存空间并进行操作。
例如,以下代码分配了一个大小为sizeof(struct student)的内存空间,并将其地址赋值给指向struct student类型的指针变量p:
```
#include <stdio.h>
#include <stdlib.h>
struct student {
char name[20];
int age;
};
int main() {
struct student* p = (struct student*)malloc(sizeof(struct student)); if (p == NULL) {
printf("Failed to allocate memory!\n");
return -1;
}
strcpy(p->name, "Tom");
p->age = 20;
printf("Name: %s, Age: %d\n", p->name, p->age);
free(p);
return 0;
}
```
此代码段中,我们使用malloc函数将一个名为“Tom”的学生结构体变量动态分配到内存中,并将其地址赋值给p。然后我们可以使用p指针变量来访问和修改结构体变量的成员。
怎么malloc一个结构体类型的指针数组
要malloc一个结构体类型的指针数组,可以按照以下方法操作:
1.先定义结构体类型,例如:
```
typedef struct {
int age;
char name[20];
} Person;
```
2.定义指针类型指向该结构体类型,例如:
```
Person *p;
```
3.申请指针数组空间,例如:
```
int count = 10;
p = (Person *)malloc(count * sizeof(Person));
```
其中,count为数组元素个数,sizeof(Person)表示每个元素的大小,用malloc函数申请的是一段连续的内存空间,所以需要将返回值进行强制类型转换为Person指针类型。
最后,记得使用完指针数组后要释放内存空间,使用free函数即可。
阅读全文