作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
假设由于某种原因你只能在 C 程序中使用静态内存。我有一个在几个地方使用的基本结构,定义如下:
#define SMALL_STUFF_MAX_SIZE 64
typedef struct {
/* Various fields would go here */
...
double data[SMALL_STUFF_MAX_SIZE]; /* array to hold some data */
} SmallStuff;
现在,我被要求添加一项新功能,该功能导致我需要相同结构但具有更大数组的特定情况。由于内存太紧,我无法承受 SmallStuff 结构数组的最大值。所以我制作了一个特殊版本的结构,如下所示,当调用需要指向 SmallStuff 结构的指针的函数时,我最终将其转换为 (SmallStuff*)(这些函数中正确处理了“数据”的实际大小)
#define BIG_STUFF_MAX_SIZE 1000000
typedef struct {
/* Various fields, identical to the ones in SmallStuff would go here */
...
double data[BIG_STUFF_MAX_SIZE]; /* array to hold some data */
} BigStuff;
显然,正确的方法是动态分配内存,但如上所述,我不能使用动态内存分配。
是否有任何我应该考虑的副作用?或者有更好的方法来处理这类问题?
提前致谢。
最佳答案
你做的很好,虽然它往往会吓到那些对指针和转换感到不舒服的人。
您的问题的一般解决方案是摆脱 BigStuff 和 SmallStuff,并创建一个包含 size 成员和指向您选择的数组的双 *data 的单个 Stuff 结构,而不是冒着以后在代码中出现潜在错误的风险或者当你发现你还需要 MediumStuff 时不得不改变你的功能。这使您可以灵活地使用任何合适的尺寸。
typedef struct
{
// the usual
size_t data_length;
double *data;
} Stuff;
double bigdata[BIG_STUFF_MAX_SIZE];
Stuff big = { ..., BIG_STUFF_MAX_SIZE, bigdata };
关于在 C 中将 'BigStruct' 转换为 'SmallStruct'(具有不同大小的静态数组的类似结构),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1523227/
假设由于某种原因你只能在 C 程序中使用静态内存。我有一个在几个地方使用的基本结构,定义如下: #define SMALL_STUFF_MAX_SIZE 64 typedef struct {
我是一名优秀的程序员,十分优秀!