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

C 将内存分配给结构指针时出错,c,structure,dynamic-memory-allocation,C,Structure,Dynamic Memory Allocation,我试图为我全局声明的结构指针分配内存。但我得到了这个错误-->错误:初始值设定项元素不是常量 typedef struct A { uint32_t arr[30][4096]; uint32_t var1; uint8_t var2; bool var3; }B; B *x = (B*)malloc(sizeof(B)); 谁能解释一下我哪里做错了。 另外,除了动态内存分配之外,是否有直接的方法将内存分配给结构指针? 提前感谢。您不能像声明变量那样

我试图为我全局声明的结构指针分配内存。但我得到了这个错误-->
错误:初始值设定项元素不是常量

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

B *x = (B*)malloc(sizeof(B));
谁能解释一下我哪里做错了。 另外,除了动态内存分配之外,是否有直接的方法将内存分配给结构指针?
提前感谢。

您不能像声明变量那样在全局范围内使用
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;
}
本标准对常量表达式的定义如下:

6.6常量表达式

(7) 初始值设定项中的常量表达式允许更大的自由度。这种常数表达式应为或计算为一 其中:

-一个算术常数表达式

-一个空指针常量

-地址常量,或

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

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


C不允许在全局范围内(函数之外)有泛型语句或表达式,甚至不允许初始值设定项。在全局范围中,仅允许编译时常量作为初始值设定项

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

// Definition of variable
B *x;

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

    ...
}

这是真的密码吗?由于结构中的
member 1
并不意味着与
int a
完全相同的代码,
int n
有效,请提供有关成员类型的更好信息。请尝试创建以向我们展示,最好是我们可以复制粘贴(无需编辑)的内容然后自己复制问题。错误发生在哪里?你包括stdlib.h吗?尝试将
typedef结构A{
更改为
typedef结构{
您正在执行
B*x=(B*)malloc(sizeof(B))
在全局范围内,还是在函数内?这应该是你的一部分。谢谢你的回答。谢谢你的详细解释。我仍然有疑问。如果我像这样全局声明结构指针
B*x;
并且在所有将使用此变量的函数内,我将像这样分配内存-->
x=malloc(sizeof(B));
,那么我应该做
免费(x)吗
在所有函数中?我必须提到,这些函数将被迭代多次调用。每次使用
malloc
分配某个对象时,您都在消耗/分配堆内存。如果不
释放
分配的内存并覆盖全局变量
x
的当前值,您就丢失了g指向已分配内存的指针,该内存将丢失。因此:始终
free
m-allocated
内存之前,为该信息重新分配malloc
新内存库。或者,您可以使用标准函数
// Definition of variable
B *x;

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

    ...
}