【问题标题】:Not able to declare a dynamic array of structs无法声明结构的动态数组
【发布时间】:2017-02-11 05:52:24
【问题描述】:

我收到以下代码的编译错误。我已经尽力了,但无法弄清楚。任何帮助将不胜感激。

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

#define N 100

int counter=0;
struct node {
    int value; };
struct node *p = (struct node  *) malloc (N*sizeof (node));

void main()
{

    int a = 5, b=6;
        struct node * c = 0;
    c = add(a,b); 
}

void add(int m, int n)
{
    struct node * pin_1;
        struct node * pin_2;
        struct node * pin_0;
    pin_0->value = m;
    pin_1->value = n;
    pin_2->value = m + n;
    counter++;
    printf("value of out is %d /n", pin_2->value);       
}

我在 GCC 中遇到错误:

struct_check.c:9: 错误:‘node’ 此处未声明(不在函数中)

【问题讨论】:

标签: c struct compiler-errors dynamic-memory-allocation


【解决方案1】:

首先,在语法上,你需要改变

  struct node *p = (struct node  *) malloc (N*sizeof (node));

  struct node *p = malloc (N*sizeof ( struct node));

因为,node 本身不是一个类型,除非你使用typedef 来创建一个。

也就是说,

  • 您不能在全局范围内执行 语句,请将其移动到某个函数内。
  • 您似乎从未在任何地方使用过p
  • 您正在使用未初始化的pin_2pin_0,这会调用undefined behavior。您需要先让这些指针指向一些有效内存,然后才能取消引用它们。
  • 根据最新标准,void main() 已过时,对于托管环境,符合要求的签名至少为 int main(void)
  • 您可以使用样式struct node *p = malloc ( N *sizeof(*p)); 编写更健壮的语句

【讨论】:

  • @ShankhadeepMukerji 你不需要,至少在 C 中不需要。
  • 是的,强制转换在 C++ 中是强制性的,但在 C 中,void * 隐式转换为任何 sometypename *
  • 在 C++ 中,不鼓励使用 malloc()。通过回应这种劝阻,即在这种情况下不使用malloc(),无论如何都避免了强制转换的需要。
  • @ShankhadeepMukerji 在main() 中分配p 并将其作为参数传递给函数。
猜你喜欢
  • 2020-11-09
  • 1970-01-01
  • 2017-08-07
  • 1970-01-01
  • 1970-01-01
  • 2023-02-09
  • 1970-01-01
  • 1970-01-01
  • 2016-02-19
相关资源
最近更新 更多