当我在结构中使用数组时,我遇到了一些奇怪的事情 [duplicate]

When I use an array inside a struct, I encounter some strange thing [duplicate]

提问人:施凱翔 提问时间:11/3/2023 更新时间:11/3/2023 访问量:60

问:

当我运行以下代码时:

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <string.h>

struct BC_messages {
    uint16_t hz;
    uint16_t counter;
    uint16_t data[];
};

struct BC_messages* createMessage(struct BC_messages* m, uint16_t hz, 
                                    uint16_t counter, int a)
{
    m = malloc(sizeof(*m) + sizeof(uint16_t) * a);
    m->hz = hz;
    m->counter = counter;
    
    return m;
}

int main()
{
    struct BC_messages* m1 = createMessage(m1, 2, 4, 6);
    m1->data[7] = 0xCCCC;
    printf("%d" , m1->data[7]);

    return 0;
}

为什么数组长度为 6 时可以访问? 我甚至可以访问,这是怎么回事?m1->data[7]m1->data[1234]

我期望当阵列超出范围时无法访问该阵列。

数组 C 结构

评论

3赞 Some programmer dude 11/3/2023
C 没有边界检查。作为程序员,您有责任确保不会超出分配的内存范围。
2赞 Jabberwocky 11/3/2023
C 中没有边界检查。您只需访问那里的内存即可。这是未定义的行为
0赞 Some programmer dude 11/3/2023
另请注意,虽然编译器可能能够捕获实际数组(尚未衰减为指针)的它,但对于灵活的数组成员或可变长度数组是不可能的,因为这些数组在编译时没有大小。
1赞 chux - Reinstate Monica 11/3/2023
@施凱翔 “我预计当阵列超出范围时无法访问阵列>。”你期望会发生什么?
1赞 施凱翔 11/3/2023
@chux-恢复莫妮卡哈哈,我本来以为会得到一个错误。

答: 暂无答案