在C语言中,以下代码是否安全?
我正在使用微控制器,不想使用malloc。此外,将所有内容收集在结构体中看起来更好,而不是将存储作为上下文之外的单独变量。
[编辑1] 我已经测试过它,编译并工作正常,指向my_context.my_storage和my_context.buffer.storage的指针相同,在Linux ... 3.2.0-4-amd64 #1 SMP Debian 3.2.65-1+deb7u2 x86_64 GNU/Linux上使用gcc(Debian 4.7.2-5)4.7.2。
[编辑2] 在一个后来被删除的答案中,我被引用了C99标准第6.7.8-19节:“初始化应按初始化程序列表顺序进行...”这是否意味着?
struct Buffer {
size_t size;
int8_t *storage;
};
struct Context {
struct Buffer buffer;
int8_t my_storage[10];
};
struct Context my_context = {
.buffer = {
.size = 0,
.storage = my_context.my_storage,
},
.my_storage = {0},
};
我正在使用微控制器,不想使用malloc。此外,将所有内容收集在结构体中看起来更好,而不是将存储作为上下文之外的单独变量。
[编辑1] 我已经测试过它,编译并工作正常,指向my_context.my_storage和my_context.buffer.storage的指针相同,在Linux ... 3.2.0-4-amd64 #1 SMP Debian 3.2.65-1+deb7u2 x86_64 GNU/Linux上使用gcc(Debian 4.7.2-5)4.7.2。
[编辑2] 在一个后来被删除的答案中,我被引用了C99标准第6.7.8-19节:“初始化应按初始化程序列表顺序进行...”这是否意味着?
struct Context my_context = {
.my_storage = {0},
.buffer = {
.size = 0,
.storage = my_context.my_storage,
},
};
这是绝对安全的吗?我是这样理解的。
[编辑3] 下面是一个完整的工作示例。
#include <inttypes.h>
#include <stdio.h>
#include <stdlib.h>
struct Buffer {
size_t size;
int8_t *storage;
};
struct Context {
struct Buffer buffer;
int8_t my_storage[10];
};
struct Context my_context = {
.buffer = {
.size = 0,
.storage = my_context.my_storage,
},
.my_storage = {0},
};
int
main(void)
{
printf ("ptr points to: %" PRIXPTR "\n", (uintptr_t)my_context.buffer.storage);
printf ("storage is at: %" PRIXPTR "\n", (uintptr_t)my_context.my_storage);
}
>> ./test
ptr points to: 600950
storage is at: 600950
struct Context { size_t size; int8_t my_storage[10];};
? - Lundin{.head=0, .tail=0, .size=0, .storage=...
,并且该环形缓冲区通过其自己的一组已提供的函数进行操作。 - evading