将内存分配给枚举

时间:2013-02-02 09:53:43

标签: c

我有一个结构和一个枚举,

    struct __value
    {
       int a;
       enum xsd__boolean *ptr;
    } 
    enum xsd__boolean
    {
      __true = 1,
      __false = 0
    };

这是使用malloc进行枚举和赋值的正确方法吗,我想将__true或__false的值赋给*__StructPtr->ptr .__true的大小是否与int的大小相同?

struct __value *__StructPtr;
__StructPtr->ptr = (int *)malloc(sizeof(int)); 
*__StructPtr->ptr = __true;

这是正确的方法,请通过一些例子向我提供一些见解。

3 个答案:

答案 0 :(得分:1)

struct __value *__StructPtr;
__StructPtr->ptr = (int *)malloc(sizeof(int)); 
*__StructPtr->ptr = __true;

这是不正确的。您的__StructPtr指针未指向已分配的内存,因此通过指针进行分配会导致内存损坏。

正确的方法是:

struct __value __StructPtr;
__StructPtr.ptr = malloc(sizeof(*__StructPtr.ptr)); 
*__StructPtr.ptr = __true;

在这种情况下,您在堆栈上分配struct __value,然后动态创建__StructPtr->ptr指向的内存。

如果您想动态分配__StructPtr和内存__StructPtr->ptr点,请尝试:

struct __value *__StructPtr;
__StructPtr = malloc(sizeof(*__StructPtr));
__StructPtr->ptr = malloc(sizeof(*__StructPtr->ptr)); 
*__StructPtr->ptr = __true;

答案 1 :(得分:0)

首先,当你有两个指针(struct __value *__StructPtrenum xsd__boolean *ptr)时,你需要内存分配。

对于你的问题,正如here所述,枚举的大小是由编译器定义的,所以没有给出它的大小为int,你应该改为分配枚举大小的内存

struct __value *__StructPtr = malloc(sizeof(struct __value));
__StructPtr->ptr = (int *)malloc(sizeof(enum xsd_boolean)); 
*__StructPtr->ptr = __true;

此外,您可能不应该使用以两个下划线开头的类型名称,因为它们是根据C标准为系统或编译器保留的。

我不确定为什么你想要一个指向enum xsd__boolean的指针,但是如果它没有充分的理由你可能不喜欢没有指针而是分配枚举结构。然后你的代码看起来像这样:

struct __value
{
   int a;
   enum xsd__boolean b;
}
...
struct __value *__StructPtr = malloc(sizeof(struct __value));
__StructPtr->ptr = __true;

答案 2 :(得分:0)

我很难知道从哪里开始......首先,符号开头的两个下划线保留给编译器/库实现。如果您正在编写编译器或C库,我希望您知道如何分配内存。因此,请删除姓名开头的__

struct __value *__StructPtr;
__StructPtr->ptr = (int *)malloc(sizeof(int)); 
*__StructPtr->ptr = __true;

现在,让我们选择这个appart。

  1. 您尚未为__StructPtr分配任何内存 - 因此它指向某个未知的地方。
  2. 不要转换malloc的结果 - 如果您将代码编译为C,则不需要它。如果您将其编译为C ++,则使用new - 但您标记了此作为C,所以只需删除`(int *)。
  3. 您应该使用sizeof(enum xsd__boolean),因为这是您枚举的名称。 int可能大于或小于enum xsd_boolean
  4. 为什么你首先为一个布尔值分配内存稍微超出我的范围 - 指针占用的空间与布尔值一样多。在这个例子中根本不要使用指针。