【发布时间】:2020-05-03 10:11:52
【问题描述】:
我试图找到为如下结构动态分配内存的正确方法:
typedef struct myThread {
unsigned int threadId;
char threadPriority;
unsigned int timeSlice;
sem_t threadSem;
} myThread;
我记得,但我不确定,在一些学校论文中,我看到为这种情况分配内存的正确方法是:
myThread *node = (myThread *)malloc(sizeof(myThread *));
我试过了,它奏效了,但我不明白为什么。我的体系结构的 Sizeof 指针是 8 个字节,所以通过编写上面的指令,我分配了 8 个字节的连续内存,不足以容纳我的结构中所需的信息。所以我尝试分配 1 个字节的内存,如下所示:
myThread *node = (myThread *)malloc(1);
而且它仍在工作。 我试图找到这种行为的答案,但没有成功。为什么这行得通?除此之外,我还有几个问题:
- 为结构动态分配内存的正确方法是什么?
- 这种演员阵容有必要吗?
- 结构如何存储在内存中?我知道 (*node).threadId 等价于 node->threadId 这让我有点困惑,因为通过解除对结构的指针的引用,我得到了整个结构,然后我必须访问一个特定的字段。我期望以这种方式访问知道结构地址的字段: *(node) 它是第一个元素的值, *(node + sizeof(firstElement)) 它是第二个元素的值,依此类推。我认为访问结构字段类似于访问数组值。
谢谢
稍后编辑:感谢您的回答,但我意识到我没有正确解释自己。通过说它有效,我的意思是它可以在结构的那些特定字段中存储值并在以后使用它们。我通过填写字段并在之后打印它们来测试它。我想知道为什么这是有效的,为什么我可以填充和使用我只为其分配一个字节内存的结构字段。
【问题讨论】:
-
myThread *node = (myThread *)malloc(sizeof(myThread *));必须是myThread *node = (myThread *)malloc(sizeof(myThread));并且演员阵容没用,所以最后是myThread *node = malloc(sizeof(myThread)); -
a.b是访问结构对象b中名为b的字段的语法a -
T *p = malloc( sizeof *p );是个好模式 -
为什么会这样? 未定义的行为,任何事情都可能发生(包括“代码工作”)
-
sizeof(myThread)或sizeof(*node)。后者更“健壮”,因为它允许您更改*node的类型而不更改此分配。
标签: c pointers memory malloc structure