簡體   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