C联合定义
在一个结构中,我需要一些空间来放置一些东西。这个空间必须能够收集所有数据类型,所以我想定义一个联合。空间限制为n个字节(无符号字符) 我必须如何定义我的并集,以便它可以包含char、int、float等等 我必须这样做吗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)
#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