在运行时将char [x]的大小调整为char [y]

won*_*rer 3 c resize char

好的,我希望我能正确解释这个.我有一个结构:

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甚至复制你现有的数据,你还想要什么?

那么为什么你认为你不能使用指针?最好尝试解决这个问题.

  • @wonderer,每个IPC机制都有一些方法来传递可变数量的数据.您应该研究如何使用您使用的任何机制来执行此操作. (7认同)

KIV*_*KIV 5

你会重新安排这样的结构

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)

这是一个丑陋的方法,我不推荐它(我会使用指针),但是你的问题的答案是如何在没有指针的情况下做到这一点.

一个限制是它允许每个结构只有一个可变大小的成员,并且必须在最后.

  • 如果这应该是C,则不要转换`malloc`的返回值.http://c-faq.com/malloc/mallocnocast.html (4认同)

Chr*_*uin 5

让我总结一下我在这个帖子中看到的两个要点:

  1. 该结构用于通过某种IPC机制在两个程序之间进行交互
  2. 目标程序无法更改

因此,您无法以任何方式更改该结构,因为目标程序试图按当前定义读取它.我怕你被困住了.

您可以尝试找到获得等效行为的方法,或者找到一些邪恶的黑客来强制目标程序读取新结构(例如,修改可执行文件中的二进制偏移).这些都是非常具体的应用程序,所以我不能给出更好的指导.

您可以考虑编写第三个程序作为两者之间的接口.它可以接收"长"消息并对它们执行某些操作,并将"短"消息传递给旧程序.您可以非常轻松地在IPC机制之间注入它.