将内存分配给结构指针时出错

时间:2019-12-19 08:58:09

标签: c structure dynamic-memory-allocation

我正在尝试为我在全局声明的结构指针分配内存。但是我遇到了这个错误-> error: initializer element is not constant

typedef struct A {
    uint32_t arr[30][4096];
    uint32_t var1;
    uint8_t  var2;
    bool     var3;
}B;

B *x = (B*)malloc(sizeof(B));

谁能向我解释我做错了什么。 另外,除了动态内存分配以外,还有直接的方法可以将内存分配给结构指针吗? 预先感谢。

2 个答案:

答案 0 :(得分:5)

您不能在全局范围内使用malloc来声明变量。 您必须使用常量来初始化全局范围内的变量。

您可以在函数内部使用它(它是一个函数调用)

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

typedef struct {
    uint32_t arr[30][4096];
    uint32_t var1;
    uint8_t  var2;
    bool     var3;
}A;

A *x;

int main()
{
    x = malloc(sizeof(A));

    if (x != NULL)
    {
        free(x);
    }

    return 0;
}

形成c99标准。

  

6.7.8初始化

     
      
  1. 具有静态存储持续时间的对象的初始化程序中的所有表达式应为常数表达式或字符串   文字
  2.   

常量定义如下:

  

6.4.4常量

     

语法

     

常数:

integer-constant       (e.g. 4, 42L)
floating-constant      (e.g. 0.345, .7)
enumeration-constant   (stuff in enums)
character-constant     (e.g. 'c', '\0')

标准将常量表达式定义如下:

  

6.6常量表达式

     

(7)允许初始化程序中的常量表达式具有更大的自由度。该常数表达式应为或评估为   以下:

     

-算术常数表达式

     

-空指针常量

     

-地址常数,或

     

-对象类型的地址常量,加上或减去一个整数常量表达式。

     

(8)算术常数表达式应具有算术类型并且应   仅具有个操作数,它们是整数常量,浮点常量,   枚举常量,字符常量和sizeof表达式。   算术常数表达式中的强制转换运算符只能转换   算术类型转换为算术类型,但作为操作数的一部分   sizeof运算符,其结果是整数常量。

答案 1 :(得分:3)

C不允许您在全局范围内(函数之外)使用通用语句或表达式,即使是初始化程序也不允许。在全局范围内,仅允许将编译时常量用作初始化程序。

如果要初始化指针,则需要将其作为函数内部的赋值来完成,也许是main函数中的第一件事:

// Definition of variable
B *x;

int main(void)
{
    // Initialization of variable through assignment
    x = malloc(sizeof *x);

    ...
}