c、 malloc和realloc是一个结构数组

c、 malloc和realloc是一个结构数组,c,malloc,realloc,C,Malloc,Realloc,假设我有一个名为Thing的结构。如果我想要一个“东西”数组,但它没有固定的大小(动态),我该如何为它分配空间?我是否首先为数组本身分配malloc空间,然后每次添加元素时都必须重新分配loc空间? 例如: struct Thing{ char *stuff; char **morestuff; int evenmorestuff; }; Thing *thingarray; thingarray = malloc(sizeof(Thing)); .... //An

假设我有一个名为Thing的结构。如果我想要一个“东西”数组,但它没有固定的大小(动态),我该如何为它分配空间?我是否首先为数组本身分配malloc空间,然后每次添加元素时都必须重新分配loc空间? 例如:

struct Thing{
    char *stuff;
    char **morestuff;
    int evenmorestuff;
};

Thing *thingarray;
thingarray = malloc(sizeof(Thing));

....

//And then allocating space for elements, which will get called an unknown amount of times
Thing j;
thingarray[count] = j;

如何设置malloc和realloc,以便能够将尽可能多的Thing类型的元素添加到“Thing”数组中?

由于数组中没有任何元素,因此可以从空指针(Thing*thingarray=NULL;)开始


添加项目时,需要为每个项目分配内存。对第一个项目使用malloc,对其他项目使用realloc将起作用。

您需要对一定数量的“东西”使用malloc

说:malloc(sizeof(thing)*8)为他们中的八个人获得空间


如果您需要更多的空间,则必须使用临时变量重新分配空间。

您可能需要使用以下策略:跟踪其中的项目数量和当前容量,然后在任何时候填满,将容量加倍。您可以得到摊销线性时间和数组的随机访问。

如果可以,请尝试对动态数组使用向量。这将为您节省大量时间,您不必担心分配问题:

#include <vector>
using namespace std;

struct Thing
{
    char *stuff; 
    char **morestuff; 
    int evenmorestuff; 
};

int _tmain(int argc, _TCHAR* argv[])
{
    vector<Thing> vt;

    char stuff = 'a';
    char *morestuff = "abc";

    Thing t;
    t.stuff = &stuff;
    t.morestuff = &morestuff;
    t.evenmorestuff = 0;

    int count = 10;
    for (int i = 0; i <= count; ++i)
    {
        t.evenmorestuff = i;
        vt.push_back(t);
    }

    Thing j; 
    j.stuff = &stuff;
    j.morestuff = &morestuff;
    j.evenmorestuff = 0;

    vt[count] = j; 

    return 0;
}
#包括
使用名称空间std;
结构物
{
字符*东西;
炭素;
甚至更多的东西;
};
int _tmain(int argc,_TCHAR*argv[]
{
向量vt;
char stuff='a';
char*morestuff=“abc”;
事物t;
t、 stuff=&stuff;
t、 morestuff=&morestuff;
t、 evenmorestuff=0;
整数计数=10;

对于(int i=0;i
Thing
确实有一个固定的大小。它的大小是一个
char*
的大小。我编辑了Thing struct以显示它的更多属性…那么它的大小会是多少呢?你只需将你的
malloc
调用乘以你需要的多少元素,假设你知道你想从多少元素开始在C中处理动态增长的结构数组-X11标记是数组管理代码附带的。那里的结构比这里简单;但是可以很容易地添加单个结构内容的动态内存分配。@KerrekSB,实际上struct Thing的大小是struct Thing。它的大小是多少?它的大小是多少(struct Thing)当然:-)不,实际上不必使用临时变量重新分配空间。标准的
realloc
函数将分配适当的空间量,必要时复制旧值,然后返回指向新的更大动态数组的指针(这可能与旧的动态数组(现在是垃圾内存)的指针相同,也可能不同。)啊,我很抱歉。我不知道realloc,我总是手动操作。@AdamMihalcin:小心;如果你写
x=realloc(x,newsize);
realloc()
失败,你(通常)内存泄漏。您需要在以下位置使用一些变量:
void*y=realloc(x,newsize);if(y==0)…错误处理…;否则x=y;
。这可能被解释为使用临时变量;
y
的持续时间有限。@JonathanLeffler是的,当然我知道
realloc
,与分配内存的任何其他标准C函数一样,可能会失败。说
realloc
返回指向新的更大动态ar的指针ray就像说,
malloc
返回一个指向新分配内存块的指针——在这两种情况下,“此函数调用可能失败”部分描述被淘汰了。欢迎使用堆栈溢出。有趣的代码;问题是标记C,但是你的代码使用C++头和符号。如果你把代码标记为“C++是如何做到这一点的”,你会逃脱惩罚的,但是人们可能会在没有这种符号的情况下变得脾气暴躁。
也有点问题;您可能应该诊断这在Windows上可以工作,但在其他地方不行。如果您修改
stuff
morestuff
所指的内容,是否会遇到此代码的问题?修复此问题可能需要在“
struct
中使用构造函数等。-1您可能已经发布了Python或者Ruby代码……这些都是同样重要的。@Jonathan,谢谢你的好意评论,下次我会知道的。