为什么通过强制转换结构的动态分配不起作用?

时间:2018-02-05 10:50:09

标签: c struct casting dynamic-allocation

我有以下结构:

typedef struct ${
 char author[27];
 char iso[2];
 int nrVolumes;
 TVolume* volume; //this is another struct
}TAuthor;

我需要一个函数来返回指向TAuthor的指针。这个函数将传递一个int-nrVol-并且它必须返回一个指向TAuthor的指针,该指针有nrVolumes字段= nrVol。我已经完成了功能。

TAuthor* aloc1(int nrVol){
  TAuthor* new = (TAuthor*)malloc(sizeof(TAuthor));
  new->nrVolumes = nrVol;
  return new;
}

这个按预期运行。

TAuthor* aloc2(int nrVol){
  char* new = malloc(sizeof(TAuthor));
  (TAuthor*)new->nrVolumes = nrVol;
  return (TAuthor*)new;
}

编译时“aloc2”给出了这个错误:     请求'nrVolumes'成员不是结构或联盟

为什么我的演员不工作?由于“new”只是一个字节数组,我想即使通过强制转换编译器也不知道哪个字节负责哪个字段,但我不确定这个

2 个答案:

答案 0 :(得分:2)

首先需要对TAuthor进行类型转换,然后将其指向其成员:

TAuthor* aloc2(int nrVol){
  char* new = malloc(sizeof(TAuthor));
  ((TAuthor*)new)->nrVolumes = nrVol;
  return (TAuthor*)new;
}

答案 1 :(得分:-1)

两个错误:

  • ->运算符的优先级高于强制转换运算符。
  • 您不应该从char数组转换为结构,因为这将调用严格的别名错误。 What is the strict aliasing rule?

只需使用第一个版本即可。