繁体   English   中英

C中结构指针的大小是多少?

[英]What is the size of a structure pointer in C?

如果结构指针的大小为 4 或 8 字节,它如何在动态 Memory 分配中为其数据成员正确分配所需的 memory。 这是我的代码:

#include<stdio.h>
typedef struct node{
   char a[10];
   char b[10];
   char c[10];
   int f;
   struct node* next;
}node;

int main()
{
   node* temp;
   int d= sizeof(node *);
   printf("Size of structure pointer = %d",d);
   temp= (node*)malloc(sizeof(node*));
   int c = sizeof(temp);
   printf("Size of Temp = %d\n",c);
}
```````````````````
/*
Here both Temp and node* is having a size of 8 bytes. 
But the size of the structure 'node' is 38 bytes(total size of the members). 
So how can the pointer Temp allocate that much memory if its size is just 8 bytes ?
*/

因为您不将数据存储在指针中。 指针指向在别处分配的数据,因此得名“指针”。 sizeof(node*)是错误的,指针本身的大小无关紧要。

你应该做

temp = malloc(sizeof *temp); // equivalent of sizeof(Node)
...
free(temp);

这是指向节点结构的指针,您不需要为它分配空间。 它可以指向节点结构。

struct node *node_ptr;

如果要在某个指针处存储节点结构,则需要为节点结构分配空间而不是指针

node *node_data = malloc(sizeof(struct node));

您不需要从 malloc 转换结果,这很糟糕{请参阅malloc 的转换}

指针只是指针。 如果你是战争博物馆的导游,用指针显示坦克——你手中的指针重量是多少? 木棍的重量还是坦克的重量?

首先让我们了解一下 malloc:Malloc 是一个 function,它在 HEAP6 中分配 ZCD69B4957F06CD818DZ19 部分的 ZCD69B4957F06CD818DZ7BF3D6 如果我们定义一个变量,通常它会被分配到 RAM 的 STACK 部分。

temp = (int*)malloc(n*sizeof(int));

此代码在 HEAP 中分配了一个 memory。

现在让我们了解一下 ponters:考虑以下代码。

int a;
int *p;
p=&a;

在 about 代码行中,指针“p”存储变量“a”的地址。 根据系统的字长(32 位或 64 位),指针变量“p”的大小会发生变化。 它可以是 2 字节或 4 字节或 8 字节。 8bytes 是因为在 64 位机器中,“long int”可以占用 8bytes。

现在让我们了解两个具有结构的指针:

struct value{
int a;
int b;
char c;
};

由于上述代码是结构体的定义,memory 不会被分配。

struct value s;

现在 memory 在堆栈中分配。

struct value *s;
s = (struct value*)malloc(sizeof(struct value));

这里 memory 在堆中分配。 即使's'是结构指针,它仍然存储整个结构'value'的地址,它的大小将是4/8。 它指向整个结构而不是结构的特定成员。

一般结构“s”将包含其所有成员的数据部分。 因此,大小将是 5 或 9,具体取决于机器和填充物。

struct s{
    int   a; /* 4 bytes */
    char  b; /* 1 byte */
             /* 1 padding byte */
    short c; /* 2 bytes */
};

参考数据结构填充

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM