gpt4 book ai didi

double 型到指针型的转换

转载 作者:行者123 更新时间:2023-12-04 09:43:43 24 4
gpt4 key购买 nike

我是 C 语言的新手,现在我正在尝试实现包含 3 个元素的基本通用链表,每个元素将包含不同的数据类型值 — intchardouble

这是我的代码:

#include <stdio.h>
#include <stdlib.h>

struct node
{
void* data;
struct node* next;
};

struct node* BuildOneTwoThree()
{
struct node* head = NULL;
struct node* second = NULL;
struct node* third = NULL;

head = (struct node*)malloc(sizeof(struct node));
second = (struct node*)malloc(sizeof(struct node));
third = (struct node*)malloc(sizeof(struct node));

head->data = (int*)malloc(sizeof(int));
(int*)(head->data) = 2;
head->next = second;

second->data = (char*)malloc(sizeof(char));
(char*)second->data = 'b';
second->next = third;

third->data = (double*)malloc(sizeof(double));
(double*)third->data = 5.6;
third->next = NULL;

return head;
}

int main(void)
{
struct node* lst = BuildOneTwoThree();

printf("%d\n", lst->data);
printf("%c\n", lst->next->data);
printf("%.2f\n", lst->next->next->data);

return 0;
}

我对前两个元素没有问题,但是当我尝试将 double 类型的值分配给第三个元素时,我得到一个错误:

can not convert from double to double *

我的问题:

  1. 这个错误的原因是什么?

  2. 为什么我在 intchar 的情况下不会得到相同的错误?

  3. 如何给第三个元素的data字段赋一个double值?

问题字符串是(double*)third->data = 5.6;

最佳答案

在您的“工作”示例中,您正在调用 malloc 以获取指向某个新分配空间的指针,然后立即丢弃该指针并替换指针值 与您的整数或字符值。这或多或少是偶然的,因为在大多数 C 实现中,指针单元格可以保存整数或字符值,尽管您应该收到警告。如果您真的尝试在这些分配之后取消引用数据指针,您可能会遇到崩溃和核心转储。

您想将值放在指针指向 的位置,而不是指针本身。这意味着您需要一个额外的 *:

 *((double *)third->data) = 5.6;

(double *) 类型转换中的 * 是类型名称的一部分 - “pointer to double”。类型转换示“获取 third->data 的值并将其解释为指向 double 的指针”。结果仍然是一个指针,所以当你分配给它时,你正在改变指针指向的位置(并且可能使它指向无意义的地方)。相反,您想为它已经指向的位置分配一个值,这就是外部 * 所做的。

但是,如果您只存储基本类型,如 intchardouble,则不需要通过一个指针(并担心随之而来的内存管理)。你可以只使用 union :

struct node 
{
struct node *next;
union {
char c;
int i;
double d;
} data;
}

然后你会做例如

head->data.i = 2;
second->data.c = 'b';
third->data.d = 5.6;

关于 double 型到指针型的转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13213995/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com