我正在研究一个概率,并且作为其中的一部分遇到了以下类型的问题......
对于foll代码
#include<stdio.h>
#include<stdlib.h>
typedef struct sample
{
int a;
char b;
}sample;
int main()
{
char *buf;
buf = (char *)malloc(sizeof(char)*sizeof(sample));
buf = ((sample *) buf);
buf->a = 10;
buf->b = 'm';
printf("%d\n",(buf)->a);
printf("%c\n",(buf)->b);
return 0;
}
编译时错误是:
example.c:16:错误:请求成员a' in something not a structure or union
example.c:17: error: request for member
b',而不是结构或联合
这是因为我不能将较低的数据类型转换为更高的类型.. ??
我尝试使用Calloc代替malloc,以便可以分配contiguos块,但无济于事。
帮助我找到转换中的逻辑缺陷......
提前致谢
答案 0 :(得分:4)
Yopu应该改变
char *buf;
buf = (char *)malloc(sizeof(char)*sizeof(sample));
到
sample *buf;
buf = (sample *)malloc(sizeof(sample));
因为将buf声明为char *会阻止编译器理解您的意图(指向示例结构)。
答案 1 :(得分:2)
第buf = ((sample *) buf);
行没有做任何事情。变量buf
仍为char*
类型。
sample* sample = (sample*)malloc(sizeof(sample));
sample->a = 10;
sample->b = 'm';
printf("%d\n",(sample)->a);
printf("%c\n",(sample)->b);
更像你想要的。
答案 2 :(得分:0)
buf的类型不随演员表而改变,你需要添加一个额外的变量:
char* buf;
sample* s;
buf = malloc(sizeof(sample));
sample = (sample*)buf;
sizeof(char)
完全是多余的,按定义它是1。
答案 3 :(得分:0)
buf
的类型仍为char *
。转换不会更改接收变量的类型。你在这里做的演员阵容基本没有意义 - 指针的价值不受它所指向的影响。记忆就是记忆。
要解决此问题,请将buf
的类型更改为sample *
。
要进一步修复此问题,请移除malloc
中的演员阵容以及之后buf
的“重铸”。