0

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

    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;

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

4

3 回答 3

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堆栈上分配 a ,然后动态创建 指向的内存__StructPtr->ptr

如果您想动态分配__StructPtr并且内存__StructPtr->ptr指向两者,请尝试:

struct __value *__StructPtr;
__StructPtr = malloc(sizeof(*__StructPtr));
__StructPtr->ptr = malloc(sizeof(*__StructPtr->ptr)); 
*__StructPtr->ptr = __true;
于 2013-02-02T09:59:26.953 回答
0

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

对于您的问题,如此所述,枚举的大小是由编译器定义的,因此它不具有 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;
于 2013-02-02T10:01:09.057 回答
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. Why you allocate memory for a single boolean value in the first place is slightly beyond me - the pointer takes up AT LEAST as much space as a boolean. Don't use a pointer at all in this example.
于 2013-02-02T10:02:11.343 回答