好吧,我希望我能正确解释这一点。
我有一个结构:
typedef struct _MyData
{
char Data[256];
int Index;
} MyData;
现在,我遇到了一个问题。大多数时候MyData.Data
256 就可以了,但在某些情况下,我需要扩展它可以容纳不同大小的字符数量。
我无法使用指针。
有没有办法在运行时调整数据大小?如何?
代码受到赞赏。
EDIT 1:
虽然我非常感谢所有的评论,但“也许试试这个……”或“这样做”,或“你是错的……”评论没有帮助。代码就是这里的帮助。如果您知道答案,请发布代码。
请注意:
- 我无法使用指针。请不要试图找出原因,我就是做不到。
- 该结构被注入到另一个程序的内存中,这就是不能使用指针的原因。
抱歉在这里有点粗暴,但我在这里问这个问题是因为我已经尝试了所有认为可能有效的不同方法。
再次,我正在寻找代码。在这一点上,我对“可能有用......”或“你是否考虑过这个......”不感兴趣
再次感谢您并表示歉意。
EDIT 2
为什么如此设置?
您可以使用灵活的数组成员
typedef struct _MyData
{
int Index;
char Data[];
} MyData;
这样您就可以分配适量的空间
MyData *d = malloc(sizeof *d + sizeof(char[100]));
d->Data[0..99] = ...;
稍后,您可以释放并分配另一块内存并创建一个指向MyData
指向它,此时灵活数组成员中将有更多/更少的元素(realloc
)。请注意,您还必须在某个地方保存长度。
在 C99 之前的时代,没有灵活的数组成员:char Data[]
被简单地视为一个类型不完整的数组,编译器会对此抱怨。在这里我向您推荐两种可能的方法
- 使用指针:
char *Data
并使其指向分配的内存。这不会像使用嵌入式数组那么方便,因为您可能需要进行两次分配:一次用于结构体,另一次用于指针指向的内存。如果程序中的情况允许,您也可以将结构分配在堆栈上。
- Using a
char Data[1]
相反,但将其视为更大的对象,以便它覆盖整个分配的对象。这是正式未定义的行为,但却是一种常见技术,因此与编译器一起使用可能是安全的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)