将Char添加到结构类型

时间:2011-01-20 09:56:12

标签: c casting

我正在研究一个概率,并且作为其中的一部分遇到了以下类型的问题......

对于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块,但无济于事。

帮助我找到转换中的逻辑缺陷......

提前致谢

4 个答案:

答案 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的“重铸”。