我有一个结构和一个枚举,
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;
这是正确的方法,请通过一些例子向我提供一些见解。
答案 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 *__StructPtr
和enum 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。
__StructPtr
分配任何内存 - 因此它指向某个未知的地方。malloc
的结果 - 如果您将代码编译为C,则不需要它。如果您将其编译为C ++,则使用new
- 但您标记了此作为C,所以只需删除`(int *)。 sizeof(enum xsd__boolean)
,因为这是您枚举的名称。 int
可能大于或小于enum xsd_boolean
。