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

问题描述 投票:0回答:1

我正在尝试为我在全局声明的结构指针分配内存。但我收到此错误-> 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));

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

c structure dynamic-memory-allocation
1个回答
1
投票

不能像声明变量一样在全局范围内使用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;

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

    if (x != NULL)
    {
        // YOUR STUFF...
        free(x);
    }

    return 0;
}

形成c99标准。

6.7.8初始化

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

常量定义如下:

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)算术常数表达式应具有算术类型并且应only have操作数,它们是整数常量,浮点常量,枚举常量,字符常量和sizeof表达式。算术常数表达式中的强制转换运算符只能转换算术类型转换为算术类型,但作为操作数的一部分sizeof运算符,其结果是整数常量。


1
投票

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

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

// Definition of variable
B *x;

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

    ...
}
© www.soinside.com 2019 - 2024. All rights reserved.