给出以下代码:
int *a = NULL;
a = calloc(1, sizeof(*a));
printf("%d\n", a);
a = realloc(a, 0);
printf("%d\n", a);
return (0);
Run Code Online (Sandbox Code Playgroud)
它返回:
4078904
0
Run Code Online (Sandbox Code Playgroud)
这个realloc是免费的吗?
注意:我在WindowsXP下使用MinGW.
我realloc在循环的每次迭代中使用,迭代次数for超过10000次.
这是一个好习惯吗?realloc如果被调用很多次会导致错误吗?
假设我曾经习惯ptr = malloc(old_size);用old_size字节分配内存块.只有第一个header_size字节才有意义.我要把尺寸增加到new_size.
new_size大于old_size且old_size大于header_size.
之前:
/- - - - - - - old_size - - - - - - - \
+===============+---------------------+
\-header_size-/
Run Code Online (Sandbox Code Playgroud)
后:
/- - - - - - - - - - - - - - - new_size - - - - - - - - - - - - - - - - - - -\
+===============+------------------------------------------------------------+
\- header_size-/
Run Code Online (Sandbox Code Playgroud)
我不关心之后存储的内容,ptr + …
我有一个关于动态内存分配的问题.
上下文:我正在编写一个程序来读取单词的文本文件,并计算每个单词出现的频率(每行一个单词).
这个特殊的函数读取文件,计算行和字符,然后动态地将内存分配给字符串指针数组,一个数组存储每行的字符数和字符串本身.(其他部分与我的问题不太直接相关).
问题:如果空间不足,我应该多久重新分配一次内存?我设置了一个常量("memstart")来设置初始内存分配值.在下面的代码片段中,我重新分配了"memstart"值的每一行.如果重新分配更大的内存块而不是每次增加1"变量类型"的内存空间,程序是否会更快?
对于这样的事情,最佳做法是什么?
代码剪辑:
int read_alloc(FILE* fin, FILE *tmp, char **wdp, int *sz){
int line_cnt= 0, chr, let=1;
do{
chr=getc(fin);
let++;
//count characters
if(chr!=EOF){
chr=tolower(chr);
fputc(chr, tmp);
}
//convert to lcase and write to temp file
if ('\n' == chr || chr==EOF){
sz[(line_cnt)]=((let)*sizeof(char)); //save size needed to store string in array
*(wdp+(line_cnt))=malloc((let)*sizeof(char)); //allocate space for the string
if ((line_cnt-1) >= memstart){
realloc(wdp, (sizeof(wdp)*(memstart+line_cnt))); //if more space needed increase size
realloc(sz, (sizeof(sz)*(memstart+line_cnt)));
}
line_cnt++;
let=1;
}
} …Run Code Online (Sandbox Code Playgroud) 我相信在C++中,处理重新分配的更好方法是使用STL向量,因为它保证了连续的存储位置.
我有几个问题要理解其中的区别:
谢谢,
我必须从一个文件中读取一个未知数量的行并将它们保存到一个结构中(我希望避免使用预处理来计算元素的总数).在读取阶段之后,我必须对这些行的每个元素进行一些计算.
我想出了两种方法:
使用realloc每个我读了一排时间.这样,分配阶段很慢,但由于索引访问,计算阶段更容易.
每次我读一行时都使用链表.这样,分配阶段更快,但计算阶段更慢.
从复杂的角度来看,有什么更好的?
如果做下一个:
int* array = malloc(10 * sizeof(int));
Run Code Online (Sandbox Code Playgroud)
他们使用realloc:
array = realloc(array, 5 * sizeof(int));
Run Code Online (Sandbox Code Playgroud)
在第二行(并且只有它),它可以返回NULL吗?
我想使用realloc来增加内存大小,同时保持指针不变(因为调用者使用它).realloc并不总是如此; 有时它返回一个不同的指针并释放旧的指针.我想"尝试"重新分配内存,如果不可能,使用原始指针回退到另一个方法 - 但realloc已经破坏了!
有没有办法尝试增加malloc的内存而不破坏(作为realloc)旧指针,如果它不可能?
例如
void *pold;
void *pnew = realloc(pold, newsize);
if (pnew != pold)
{
free(pnew);
DoDifferently(pold); // but pold is freed already
}
Run Code Online (Sandbox Code Playgroud)
PS我不关心可移植性(仅限linux,因此标签).
所以这次我真的不知道如何把这个头衔.首先,我想说,如果问题与"家庭作业"有关,我在这个页面上看到了一些关于警告的评论.我的是,但它也已完成,我只是想进一步了解代码发生了什么.
我也读了一段时间的帖子和书籍,但我想我仍然缺少一些东西.
我有两行代码我在我使用的代码中不太了解.这项工作是关于获取用作参数的任何文件(如果它是0文件,它从stdin读取),并在标准输出上向后打印它.所有这些,谈论C,因为我试图放入标签.
第一个问题是:
array = realloc (array, 0);
Run Code Online (Sandbox Code Playgroud)
其中数组定义为
char **array;
Run Code Online (Sandbox Code Playgroud)
问题是免费不起作用,它没有释放使用的空间(也许我用错了?在其他地方我知道如何使用它,但不是这次).通过我已经完成的测试和我读过的内容,我相信realloc也在做同样的事情,但我不是100%.
第二个是:
char* alloc = malloc (strlen ((char*)string)+1);
Run Code Online (Sandbox Code Playgroud)
其中alloc用于复制我要放入数组的行的确切长度,所以我可以在此之后向后打印文本.
问题是为什么我必须使用+1.我的意思是如果由于某种原因我不使用它不起作用,我尝试使用不同的数字,它每次都有效,但如果我不这样做+1它不能正常工作.
我知道可能这个问题太模糊,而且写的很糟糕,但是我又不确定这一点,我也尽力解释自己(英语没有母语,因为它可能很明显).
我正在努力提高代码效率.我有这样的事情:
typedef struct{
...
}MAP;
MAP* pPtr=NULL;
MAP* pTemp=NULL;
int iCount=0;
while (!boolean){
pTemp=(MAP*)realloc(pPtr,(iCount+1)*sizeof(MAP));
if (pTemp==NULL){
...
}
pPtr=pTemp;
...
iCount++;
}
Run Code Online (Sandbox Code Playgroud)
内存正在动态分配.我想减少realloc调用,使代码更有效.我想知道如果新大小等于旧大小,realloc将如何表现.电话会被忽略吗?