在函数内部填充动态分配的struct

时间:2016-04-01 02:19:31

标签: c struct

我正在尝试创建一个接受预先分配的内存指针作为输入的函数,并使用数据填充该位置的结构数组。在这个例子中,我期望输出为:

W 100
L 200

但是,第一行是正确的,但第二行不打印字符和零。我做错了什么?

typedef struct{
  char word;
  long number;
}record;

void makerec(record** data){
  data[0]->word='W';
  data[0]->number=100;
  data[1]->word='L';
  data[1]->number=200;
}

int main(){
  record* data=(record*)malloc(sizeof(record)*1000);
  makerec(&data);
  printf("%c %ld\n",data[0].word,data[0].number);
  printf("%c %ld\n",data[1].word,data[1].number);
  free(data);
  return 0;
}

1 个答案:

答案 0 :(得分:4)

您没有处理正确的类型。只需更改:

void makerec(record** data) {

为:

void makerec(record * data) {

makerec(&data);

为:

makerec(data);

以及将data[0]->word='W';和朋友更改为data[0].word = 'W';

data已经是一个指针,你想要改变它指向的东西,所以你可以直接将它传递给makerec。如果您希望data使其指向不同的内容,您可以将指针传递给makerec(),但这不是您在此处所做的事情,所以只是通过{ {1}}本身是正确的。

附带您的主要问题,但是:

data

应该是:

record* data=(record*)malloc(sizeof(record)*1000);

注意:

  1. 您不需要(而且,在我看来,不应该)投出record* data = malloc(1000 * sizeof *data); if ( !data ) { perror("memory allocation failed"); exit(EXIT_FAILURE); } 和朋友

  2. 的返回值
  3. malloc()优于sizeof *data,因为如果sizeof(record)的类型发生变化,它会继续有效,更重要的是,它会消除您应用{data的可能性1}}运算符为不正确的类型,这是一个常见的错误。

  4. 撤销sizeof1000的位置仅仅是装饰性的,以使多个sizeof *data更易于理解。

  5. 如果分配失败,您应该始终检查'*'的返回值,并采取适当的措施(例如退出程序)。