[英]Typecasting structure pointers
嗨,伙計們。 我正在使用名為《 Pointers in C: A Hands on Approach
的書研究結構和指針,在第107頁上,我遇到了一個結構類型轉換的不完整示例。 我試圖通過僅實現功能receivedata()
,添加標頭並進行一些更改來使其工作。
這是完整的代碼:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
struct signature
{
char sign;
char version;
};
struct id
{
char id;
char platform;
};
struct data
{
struct id idv;
struct signature sig;
char data[100];
};
static void receivedata(struct data *d);
static struct signature *extractsignature(struct data *d);
static struct id *extractid(struct data *d);
int main(int argc, char *argv[])
{
/* Actual line in book is :
* struct data *img; with no memory allocation or assignment to NULL.
* Had errors so i allocated memory on the heap before passing the value to
* Receivedata(); */
struct data *img = malloc(sizeof(struct data));
receivedata(img);
/* Actual line in book is :
* struct id *idval = extractid(&img);
* struct signature *sig = extractsignature(&img);
* This is obviously erroneous because &img is a pointer
* to a pointer (struct data**) which is not the data type for
* the extract functions' argument */
struct id *idval = extractid(img);
struct signature *sig = extractsignature(img);
printf("For signature:\n");
printf("sign = %c", sig->sign);
printf(" version = %c\n\n", sig->version);
printf("For id:\n");
printf("id = %c", idval->id);
printf(" platform = %c", idval->platform);
printf("\ndata = %s", img->data);
return 0;
}
static struct signature *extractsignature(struct data *d)
{
struct signature *sig = (struct signature *)d;
return sig;
}
static struct id *extractid(struct data *d)
{
struct id *idv = (struct id *)d;
return idv;
}
static void receivedata(struct data *d)
{
struct data *dptr = d;
char *ch = "CODING IS COOL!";
dptr->sig.sign = 's';
dptr->sig.version = '1';
dptr->idv.id = 'i';
dptr->idv.platform = 'p';
strncpy(dptr->data, ch, strlen(ch));
return;
}
我想了解的是函數extractid()
和extraxtsignature()
中的強制轉換,因為似乎我們正在強制轉換struct data *
,以便檢索其單個成員。 我運行了程序,得到的是sig成員和id成員的struct data
的第一個成員的值。 這是當struct id
首先出現在struct data
時的輸出:
For signature:
sign = i version = p
For id:
id = i platform = p
data = CODING IS COOL!
這是當struct signature
是第一個元素時:
For signature:
sign = s version = 1
For id:
id = s platform = 1
data = CODING IS COOL!
最后,當char data[100]
是第一個元素時:
For signature:
sign = C version = O
For id:
id = C platform = O
data = CODING IS COOL!
請您說明這種類型的鑄造,何時使用以及最佳做法。 非常感謝你。
struct data
{
struct id idv;
struct signature sig;
char data[100];
};
對於上面的定義,下面的extractid
函數有效,並且將獲得正確的結果。
static struct id *extractid(struct data *d)
{
struct id *idv = (struct id *)d;
return idv;
}
這是因為struct id
是struct data
的第一個成員。 因此,當您擁有struct data *d
, d
指向struct data
的起始地址,並且與第一個成員struct id
的起始地址相同。
因此,如果要轉換結構的第一個成員,那么按照上面提供的代碼,它是正確的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.