结构指针语法混乱

时间:2016-08-22 03:30:18

标签: c pointers struct malloc

您好我相对较新,并且想知道是否有人可以解释我在使用以下代码时究竟做了什么。

我有一个结构:

typedef struct free_list_header {
   u_int32_t magic;  // ought to contain MAGIC_FREE
   vsize_t size;     // # bytes in this block (including header)
   vlink_t next;     // memory[] index of next free block
   vlink_t prev;     // memory[] index of previous free block
} free_header_t;

我正在使用以下函数在函数内初始化它...

void vlad_init(u_int32_t size)
{

   int sizePow2 = pow(2, ceil(log(size)/log(2)));
   memory = malloc(sizePow2*sizeof(char));
   memory_size = sizePow2;
   strategy = BEST_FIT;

   free_header_t *freeHeader = (free_header_t*)memory;

   freeHeader->magic = MAGIC_FREE;    // the unique value
   freeHeader->size = memory_size;    // amount we malloc'd
   freeHeader->next = 0;              // position of next free block
   freeHeader->prev = 0;              // position of prev free block     
   free_list_ptr = 0;
}

我的问题是我在这做什么,为什么有必要?

free_header_t *freeHeader = (free_header_t*)memory;

所以...我通过指向一个名为" freeHeader"?来声明一个新结构。那是在我分配的内存中指向它的指针?那么这是一种将结构放入malloc区域以便从我初始化它的函数中访问它的方法吗?

5 个答案:

答案 0 :(得分:0)

free_header_t * freeHeader = (free_header_t*)memory;

你向一个名为freeHeader的free_header_t结构声明了一个指针(不是一个实际的结构),并为它指定了名为memory的指针的值。因为内存是指向char的指针而你的是指向其他内容的指针,所以你使用了转换。

您目前只有指向已分配区域的指针(大小为 sizePow2 * sizeof(char) - 请注意,struct的大小应小于或等于已分配内存的大小)

答案 1 :(得分:0)

您的代码基本上等同于:

free_header_t *freeHeader = malloc(sizePow2 * sizeof(char));

它分配一个包含sizePow2字节的内存块,然后将其用作free_list_header结构的地址。

它使用memory变量的原因是因为其他一些代码将使用nextprev成员作为该内存块的索引。顾名思义,这个结构只包含内存块开头的数据,其余的内存由其他结构管理。

答案 2 :(得分:0)

Malloc返回一个void指针(类型为void *)。这意味着它返回一个指向内存地址的指针,该指针未指向任何特定类型。在行之后:

memory = malloc(sizePow2*sizeof(char)); //sizePow2 is n bytes to allocate

memory是一个类型为指针的指针(void *)。

free_header_t *freeHeader = (free_header_t*)memory;

在左侧,您将创建一个名为freeHeader的指针,该指针指向包含free_header_t类型的内存地址 因为你明确地说这个指针指向一个类型为free_header_t的地址,所以你正在转换另一方(当前类型为void *)以匹配它作为free_header_t *。

在C中注意,这可行,但不是必需的。编译器会自动将void *转换为您需要的任何类型。但是编写这样的代码是很好的做法,在C ++中你需要明确地这样做。

答案 3 :(得分:-1)

memory = malloc(sizePow2*sizeof(char));

你在这里分配一些内存。使用

会很好
memory = malloc(sizeof(struct free_list_header));

存储结构的对象。

free_header_t *freeHeader = (free_header_t*)memory;

在这里,您将声明一个指向先前分配的内存的指针。您没有在技术上声明结构的对象。并且您没有将结构放入malloc-ed区域,而是将malloc-ed区域视为结构的对象。

free_header_t freeHeader = {0};将声明结构的对象。

答案 4 :(得分:-1)

每次调用malloc()函数时,操作系统都会返回一个内存地址。当您将此指针强制转换为特定类型时,您告诉编译器存储在已分配内存中的每个元素都将使用指定类型的大小,这样可以使事情变得更容易。

假设您声明了一个uint64_t *,并且分配的大小是uint64_t大小的100倍,因此一旦uint64_t占用8个字节,您就要求操作系统使用800个字节。如果你没有强制转换这个指针,那么每次用your_variable++增加地址时,你的程序只会跳过一个字节,你将进入“数字的中间位置并得到一个奇怪的值”,但如果你施放指向uint64_t的指针并使用your_variable++增加地址,程序将跳过8个字节,直接转到下一个数字。

在您的示例中,您告诉操作系统您的指针将存储free_header_t的类型。你没有义务去做,但这是一个非常好的做法。

是的,如果将此地址返回给另一个函数,另一个函数可以轻松更改存储在该存储区中的值。

希望它有所帮助!