好的,我希望我能正确解释这个.我有一个结构:
typedef struct _MyData
{
char Data[256];
int Index;
} MyData;
Run Code Online (Sandbox Code Playgroud)
现在,我遇到了一个问题.大多数情况下,MyData.Data可以使用256,但在某些情况下,我需要将它可以容纳的字符数量扩展到不同的大小.我不能使用指针.有没有办法在运行时调整数据大小?怎么样?代码表示赞赏.
谢谢
编辑:
虽然我非常感谢所有的评论,但"也许试试这个......"或"那样做",或"你是什么东西是错的......"评论没有帮助.代码是这里的帮助.如果您知道代码后面的答案,请继续.
和:
1-不能使用指针.请不要试图弄清楚为什么,我只是不能 - 结构被注入到另一个程序的内存中.这就是为什么.没有指针.
抱歉这里有点粗糙,但我在这里问了一个问题,因为我已经尝试了所有可能有用的不同方法.再次,我正在寻找代码.在这一点上,我对"可能工作......"或"你考虑过这个......"不感兴趣
谢谢你,我再次道歉
编辑2
为什么这个设置得到回答?
Joh*_*itb 18
您可以使用灵活的阵列成员
typedef struct _MyData
{
int Index;
char Data[];
} MyData;
Run Code Online (Sandbox Code Playgroud)
这样你就可以分配适当的空间
MyData *d = malloc(sizeof *d + sizeof(char[100]));
d->Data[0..99] = ...;
Run Code Online (Sandbox Code Playgroud)
稍后,您可以释放并分配另一块内存并指向MyData指向它的指针,此时您将在灵活数组成员(realloc)中拥有更多/更少的元素.请注意,您也必须在某处保存长度.
在Pre-C99时代,没有一个灵活的数组成员:char Data[]简单地认为是一个类型不完整的数组,编译器会对此抱怨.在这里,我建议你两种可能的方式
char *Data并使其指向分配的内存.这不如使用嵌入式数组那么方便,因为您可能需要有两个分配:一个用于struct,另一个用于指针指向的内存.如果程序中的情况允许,您也可以在堆栈上分配结构.char Data[1]替代,但将其视为更大,以便它覆盖整个分配的对象.这是一种形式上未定义的行为,但这是一种常见的技术,因此与编译器一起使用可能是安全的. sch*_*der 13
这里的问题是你的声明"我不能使用指针".你将不得不这样做,它将使一切变得更加容易.嘿,realloc甚至复制你现有的数据,你还想要什么?
那么为什么你认为你不能使用指针?最好尝试解决这个问题.
你会重新安排这样的结构
typedef struct _MyData
{
int Index;
char Data[256];
} MyData;
Run Code Online (Sandbox Code Playgroud)
并使用malloc/realloc分配实例:
my_data = (MyData*) malloc ( sizeof(MyData) + extra_space_needed );
Run Code Online (Sandbox Code Playgroud)
这是一个丑陋的方法,我不推荐它(我会使用指针),但是你的问题的答案是如何在没有指针的情况下做到这一点.
一个限制是它允许每个结构只有一个可变大小的成员,并且必须在最后.
让我总结一下我在这个帖子中看到的两个要点:
因此,您无法以任何方式更改该结构,因为目标程序试图按当前定义读取它.我怕你被困住了.
您可以尝试找到获得等效行为的方法,或者找到一些邪恶的黑客来强制目标程序读取新结构(例如,修改可执行文件中的二进制偏移).这些都是非常具体的应用程序,所以我不能给出更好的指导.
您可以考虑编写第三个程序作为两者之间的接口.它可以接收"长"消息并对它们执行某些操作,并将"短"消息传递给旧程序.您可以非常轻松地在IPC机制之间注入它.
| 归档时间: |
|
| 查看次数: |
5717 次 |
| 最近记录: |