C联合定义

C联合定义,c,C,在一个结构中,我需要一些空间来放置一些东西。这个空间必须能够收集所有数据类型,所以我想定义一个联合。空间限制为n个字节(无符号字符) 我必须如何定义我的并集,以便它可以包含char、int、float等等 我必须这样做吗 #define SIZE (128) union { unsigned char uchar[SIZE]; char schar[SIZE]; unsigned int uint[SIZE/sizeof(unsigned int)

在一个结构中,我需要一些空间来放置一些东西。这个空间必须能够收集所有数据类型,所以我想定义一个联合。空间限制为n个字节(无符号字符)

我必须如何定义我的并集,以便它可以包含char、int、float等等

我必须这样做吗

#define SIZE (128)
union {
        unsigned char uchar[SIZE];
        char schar[SIZE];
        unsigned int uint[SIZE/sizeof(unsigned int)];
        int sint[SIZE/sizeof(int)];
        float flt[SIZE/sizeof(float)];
        double dbl[SIZE/sizeof(double)];
}memory;
或者,是否可以只定义无符号字符数组的大小,然后自动定义int数组的大小?如果
SIZE
不能被4整除,会发生什么情况

编辑:(与评论相关)

我想构建一个类似定时事件处理程序的东西。这意味着,我有一个包含事件数组的结构。每个事件都有一个执行时间和一个相关函数(存储为指针)。当事件处理程序的计时器计数器与事件执行时间匹配时,我调用相关函数。在这个函数中,我知道需要哪些参数,所以我不需要保存标记值。问题是,事件是在函数中创建的,因为我不想使事件成为静态的(以节省内存),所以我在事件处理程序中添加了一些内存(环形缓冲区),所有函数都可以在其中放入一些数据。每个事件都有一个变量,其中包含指向(第一个)数据的指针。数据类型仅为nativ数据类型,没有自己的结构

这是我当前的代码:

startSystemClock()
将在启动时调用

定时器1的中断服务例程将通过设置
sysEventHandler.execute=TRUE
调用
executeSystemEvent()
,并在(1)循环检查此标志,然后调用
executeSystemEvent()


我知道,
storeSystemEventData
-函数不完整。但出于我的第一个目的,我只需要int,所以它可以工作。

除了最大的数组外,不需要指定数组大小。只是越界访问其他类型

#include "stdio.h"

union memory {
    unsigned char uchar[128];
    char schar[0];
    unsigned int uint[0];
    int sint[0];
    float flt[0];
    double dbl[0];
} ;

int main (void)
{
    union memory my_mem;
    my_mem.schar[5] = 'A';
    my_mem.schar[6] = 'B';
    my_mem.schar[7] = 'C';
    my_mem.schar[8] = 'D';

    printf ("%d\n", my_mem.uint[1]);
    return 0;
}

C不提供任何一种方式的数组边界检查,因此如果您试图访问内存对象之外的内存,那就是运气不好。

除了最大值之外,您不需要指定数组大小。只是越界访问其他类型

#include "stdio.h"

union memory {
    unsigned char uchar[128];
    char schar[0];
    unsigned int uint[0];
    int sint[0];
    float flt[0];
    double dbl[0];
} ;

int main (void)
{
    union memory my_mem;
    my_mem.schar[5] = 'A';
    my_mem.schar[6] = 'B';
    my_mem.schar[7] = 'C';
    my_mem.schar[8] = 'D';

    printf ("%d\n", my_mem.uint[1]);
    return 0;
}
无论哪种方式,C都不提供数组边界检查,因此如果您试图访问内存对象之外的内存,那就是运气不好

如果大小不能被4整除,会发生什么

我假设你会问关于4的可除性问题(与任何其他数字相反),因为它是一个常见的
sizeof(int)
。当
大小
被任何
大小
不可分割时,将以完全适合
大小
的最大数组结束,即该数字将被截断。例如,当
sizeof(int)
为4时,将
SIZE
设置为
13

int sint[3];
换句话说,大小将“向下舍入”(截断)。如果您喜欢四舍五入,请使用以下表达式:

unsigned int uint[(SIZE+sizeof(unsigned int)-1)/sizeof(unsigned int)];
但是,请注意,
uint[]
数组的大小可能超过
uchar
的大小

是否可以只定义无符号字符数组的大小,然后自动定义int数组的大小

您可以将
union
替换为
char
s数组,并将
void*
指针转换为
int*
float*
等。这将导致不同的语法

如果大小不能被4整除,会发生什么

我假设你会问关于4的可除性问题(与任何其他数字相反),因为它是一个常见的
sizeof(int)
。当
大小
被任何
大小
不可分割时,将以完全适合
大小
的最大数组结束,即该数字将被截断。例如,当
sizeof(int)
为4时,将
SIZE
设置为
13

int sint[3];
换句话说,大小将“向下舍入”(截断)。如果您喜欢四舍五入,请使用以下表达式:

unsigned int uint[(SIZE+sizeof(unsigned int)-1)/sizeof(unsigned int)];
但是,请注意,
uint[]
数组的大小可能超过
uchar
的大小

是否可以只定义无符号字符数组的大小,然后自动定义int数组的大小


您可以将
union
替换为
char
s数组,并将
void*
指针转换为
int*
float*
,等等。这将导致不同的语法。

这是将数组大小设置为零的常用方法还是更常用的“hack”?我不知道。没有常见的黑客攻击,因为使用这样的联合编写代码是非常罕见的。做我想做的事情的合适方法是什么?如果数组大小信息和索引值在执行越界访问时可用,一些C编译器以及静态分析工具将提供越界警告通道还有一些带有工具的IDE,在调试模式下编译和在调试模式下使用时将执行数组越界检查。我需要对您的问题进行更高级别的描述,以建议其他方法。“收集所有数据类型”太模糊了。这是将数组大小设置为零的常用方法,还是更常用的“黑客”方法?据我所知不是这样。没有常见的黑客攻击,因为使用这样的联合编写代码是非常罕见的。做我想做的事情的合适方法是什么?如果数组大小信息和索引值在执行越界访问时可用,一些C编译器以及静态分析工具将提供越界警告通道还有一些带有工具的IDE,在调试模式下编译和在调试模式下使用时将执行数组越界检查。我需要对您的问题进行更高级别的描述,以建议其他方法。“收集所有数据类型”太模糊了。@ca中的nouney