簡體   English   中英

類型轉換結構指針

[英]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 idstruct data的第一個成員。 因此,當您擁有struct data *dd指向struct data的起始地址,並且與第一個成員struct id的起始地址相同。

因此,如果要轉換結構的第一個成員,那么按照上面提供的代碼,它是正確的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM