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);
...
}