假设一个结构体大小40 给这个结构体的指针malloc 为什么这个指针的sizeof是8而不是40
时间: 2023-11-04 11:23:22 浏览: 47
这是因为`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。
相关问题
指针结构体怎么赋给另一个指针结构体
要将一个指针结构体赋值给另一个指针结构体,可以通过以下步骤进行:
1. 创建新的目标结构体指针。
2. 使用解引用运算符 `*`,将源结构体指针所指向的实际结构体复制到目标结构体中。
3. 如果结构体中包含动态分配的内存(如字符串指针等),需要进行适当的内存分配和复制。
以下是一个示例代码,假设有两个结构体类型为 `MyStruct` 的指针 `src` 和 `dest`:
```c
#include <stdlib.h>
#include <string.h>
typedef struct {
int value;
char* text;
} MyStruct;
void copyStruct(MyStruct* dest, const MyStruct* src) {
// 复制结构体中的基本数据类型成员
dest->value = src->value;
// 复制结构体中的字符串指针成员
dest->text = malloc(strlen(src->text) + 1);
strcpy(dest->text, src->text);
}
int main() {
MyStruct* src = malloc(sizeof(MyStruct));
src->value = 123;
src->text = strdup("Hello World");
MyStruct* dest = malloc(sizeof(MyStruct));
// 将源结构体指针赋值给目标结构体指针
copyStruct(dest, src);
// 打印目标结构体中的数据
printf("Value: %d\n", dest->value);
printf("Text: %s\n", dest->text);
// 释放内存
free(src->text);
free(src);
free(dest->text);
free(dest);
return 0;
}
```
在上述示例代码中,我们定义了一个结构体类型为 `MyStruct`,其中包含一个整数成员 `value` 和一个字符串指针成员 `text`。
在 `copyStruct` 函数中,我们通过使用动态内存分配函数 `malloc` 来分配目标结构体中的字符串指针的内存,并使用 `strcpy` 函数将源结构体中的字符串复制到目标结构体中。
在 `main` 函数中,我们创建了源结构体指针 `src` 和目标结构体指针 `dest`,并通过调用 `copyStruct` 函数将源结构体赋值给目标结构体。
最后,记得释放动态分配的内存,以避免内存泄漏。
希望这个示例能对你有所帮助。如果还有其他问题,请随时提问。
但是这个结构体全是动态指针 我复制出来的不是原始数据
确实,AVPacket 中的 buf 字段对应的 AVBufferRef 结构体中的数据是动态分配的,如果直接进行 memcpy() 操作,只是复制了指针的值,而没有复制实际的数据内容,因此复制出来的数据不是原始数据。
要复制 AVPacket 中的 buf 字段对应的 AVBufferRef 结构体中的数据,可以使用 av_buffer_alloc() 函数和 av_buffer_ref() 函数进行复制。具体实现如下:
```c
AVPacket *pkt = ...; // 源 AVPacket
char *buffer = (char *) malloc(pkt->size + AV_INPUT_BUFFER_PADDING_SIZE); // 分配 char* 缓冲区,注意要包含 AV_INPUT_BUFFER_PADDING_SIZE 字节的填充数据
memcpy(buffer, pkt, sizeof(AVPacket)); // 复制 AVPacket 中的所有信息到缓冲区
AVBufferRef *src_buf = pkt->buf;
if (src_buf) {
AVBufferRef *dst_buf = av_buffer_alloc(src_buf->size); // 分配新的 AVBufferRef 结构体
av_buffer_ref(dst_buf, src_buf); // 复制 AVBufferRef 中的数据
memcpy(buffer + sizeof(AVPacket), &dst_buf, sizeof(AVBufferRef *)); // 将新的 AVBufferRef 结构体的指针复制到缓冲区
memcpy(buffer + sizeof(AVPacket) + sizeof(AVBufferRef), dst_buf->data, dst_buf->size); // 复制 AVBufferRef 中的数据到缓冲区
}
```
需要注意的是,在使用完复制的缓冲区后,需要先释放 AVBufferRef 结构体占用的内存,然后再释放缓冲区占用的内存。具体实现如下:
```c
if (dst_buf) {
av_buffer_unref(&dst_buf); // 释放复制的 AVBufferRef 结构体
}
free(buffer); // 释放 char* 缓冲区
```
需要注意的是,这种方式复制的 AVPacket 数据可以直接使用,因为它的 buf 字段中的指针已经重新指向了复制后的 AVBufferRef 结构体中的地址。