gpt4 book ai didi

c - 为结构的一部分分配内存

转载 作者:太空狗 更新时间:2023-10-29 17:13:10 24 4
gpt4 key购买 nike

我有下面的例子

#include <stdlib.h>
#include <stdio.h>
#include <stddef.h>

typedef struct test{
int a;
long b;
int c;
} test;

int main()
{
test *t = (test*) malloc(offsetof(test, c));
t -> b = 100;
}

它工作正常,但我不确定。我想我这里有 UB。我们有一个指向结构类型对象的指针。但是结构类型的对象并不是真正有效的。

我仔细阅读了标准,但找不到此行为的任何定义。我能找到的唯一接近这个的部分是 6.5.3.2:

If an invalid value has been assigned to the pointer, the behavior of the unary * operator is undefined

但这并不是真正相关的,因为 malloc 返回的指针是完全有效的。

标准中是否有解释此类行为的引用资料?我使用的是 C11 N1570。

最佳答案

来自 C2011, paragraph 6.2.6.1/4 :

Values stored in non-bit-field objects of any other object type consist of n x CHAR_BIT bits, where n is the size of an object of that type, in bytes.

因此,由于代码中分配的对象小于 struct test 的大小,因此它不能包含该类型对象的值。

现在考虑您的表达式 t -> b = 100C2011, paragraph 6.5.2.3/4定义 -> 运算符的行为:

A postfix expression followed by the -> operator and an identifier designates a member of a structure or union object. The value is that of the named member of the object to which the first expression points [...].

(强调已添加。)我们已经确定您的 t 没有(事实上,不能)指向 struct test,但是,所以我们最多只能说 6.5.2.3/4 不适用于您的情况。 -> 运算符的行为没有其他定义,我们剩下 paragraph 4/2 (强调):

If a ''shall'' or ''shall not'' requirement that appears outside of a constraint or runtime- constraint is violated, the behavior is undefined. Undefined behavior is otherwise indicated in this International Standard by the words ''undefined behavior'' or by the omission of any explicit definition of behavior.

原来如此。您的代码的行为未定义。

关于c - 为结构的一部分分配内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53904602/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com