例如,我想要这样一个功能:
char *dst = (char*)malloc(512);
char *src = (char*)malloc(1024);
...
dst = (char*)realloc(dst, 1024);
memcpy(dst, src, 1024);
Run Code Online (Sandbox Code Playgroud)
如您所见,我只是希望函数realloc()扩展缓冲区的大小,但C库中的realloc()可能会复制旧地址中的数据.那么在我想要的任何库中都有一个函数吗?
有人可以解释一下 realloc 中的第二个参数到底是什么,因为我找不到测试它的方法。
所以假设我们有这样的事情
int *p = malloc(sizeof(int)); //we have just enough space to store single int value
Run Code Online (Sandbox Code Playgroud)
现在,如果我想在 p 中存储 2 个 int 值,我是否需要发送到 realloc 作为2 * sizeof(int)块的第二个参数 新大小,或者sizeof(int)因为它需要为 int 大小扩展内存
如果我应该在这种情况下2 * sizeof(int)将新块的总价值发送到 realloc ,如果我只发送它sizeof(int),它会做什么,只返回原始指针并且在内存中什么都不做或其他什么?
可能我的大脑现在不能正常工作......我想知道为什么我在我的代码中收到提到的错误:
int ** zm;
zm = (int**)calloc(1, sizeof(int*));
*zm = (int*)calloc(1, sizeof(int));
*zm[0] = 5;
*zm = (int*)realloc(*zm, 2*sizeof(int));
*zm[1] = 10; // Access violation reading location 0xFFFFFFFFFFFFFFFF
Run Code Online (Sandbox Code Playgroud)
有人可以解释该代码中发生了什么吗?
背景:
我使用 calloc() 创建了一个数组,一切都很好。然后我使用 realloc() 使数组更大。它似乎只是创建了一个没有任何内容的新指针,并在我尝试访问数组中的元素时调用了运行时错误。
我的代码:
#include <stdio.h>
int main() {
int *arr;
for (int i = 0; i < 5; i++){
if (i == 0) {
if ((arr = (int *) calloc(1, sizeof(int))) == NULL) {
printf("NO MORE SPACE TERMINATING PROGRAM");
return NULL;
}
} else {
int *tmp;
if ((tmp = (int *)realloc(arr, 4*sizeof(int)) == NULL)){
printf("NO MORE SPACE TERMINATING PROGRAM");
}
arr = tmp;
}
arr[i] = i;
}
}
Run Code Online (Sandbox Code Playgroud)
arr[i]=i;当 i = 1 时,它在线上抛出运行时错误; …
当我realloc用来重新调整我calloc之前用来初始化的内存(一个数组)时,它是否仍然在整个缓冲区中保持为0?或新部分未初始化?
我正在尝试创建一个函数来从文本文件中读取一行,fgets()并将其存储在动态分配的 char* 中,malloc()但我不确定如何使用realloc(),因为我不知道这一行的长度文本,并且不想只是猜测该行可能的最大大小的幻数。
#include "stdio.h"
#include "stdlib.h"
#define INIT_SIZE 50
void get_line (char* filename)
char* text;
FILE* file = fopen(filename,"r");
text = malloc(sizeof(char) * INIT_SIZE);
fgets(text, INIT_SIZE, file);
//How do I realloc memory here if the text array is full but fgets
//has not reach an EOF or \n yet.
printf(The text was %s\n", text);
free(text);
int main(int argc, char *argv[]) {
get_line(argv[1]);
}
Run Code Online (Sandbox Code Playgroud)
我计划用文本行做其他事情,但为了保持简单,我刚刚打印了它,然后释放了内存。
另外: main 函数是通过使用文件名作为第一个命令行参数来启动的。
使用malloc()成功分配之后,有时程序需要增加数组的大小。尽管malloc()成功运行,但realloc()失败。
我已经使用这段代码来处理realloc()的失败。这里T是模板参数。array是类型T的指针,_size是已使用的数组的总索引,_maxSize是可用索引的最大数目。 _size达到_maxSize时需要重新分配。
if(_size == _maxSize){
_maxSize *= 2;
T *temp;
temp = (T *) realloc( array, sizeof( T ) * (_maxSize) ) ;
if(temp == NULL){
printf("...reallocation of memory failed...\n");
exit(0);
}
else{
array = temp;
}
}
Run Code Online (Sandbox Code Playgroud)
尽管处理了realloc()的失败,但是程序确实需要增加数组的大小,即使realloc()失败,我也不知道如何执行重新分配。
如何realloc()重新分配首先分配的内存malloc()?
我知道malloc()在重新分配内存之前您需要使用它,但我不明白这应该如何工作。如果动态内存对象的大小减少了realloc()怎么办?调用后是否刚刚删除了该对象的各个部分realloc()?
我的问题是:
realloc()函数如何重新分配由创建的动态内存对象malloc()?
注意:我做了这个问答是因为许多初学者似乎仍然对重新分配内存使用的问题感到困惑,realloc()尽管这里已经存在关于该主题的问题。对于不熟悉该主题但仍不能代表realloc(). 因此,由于问题,恕我直言,仍然不太适合我想要给出的答案,我进行了自己的问答。
这里是相对较新的 C 程序员。我正在审查以下代码,作为我正在练习 C 的业余项目的教程。该abuf结构的要点是创建一个可以附加的字符串。这是代码:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef struct abuf {
char* str;
unsigned int size;
} abuf;
void abAppend(abuf *ab, const char *s, int len) {
char *new = realloc(ab->str, ab->size + len);
if (new == NULL) return;
memcpy(&new[ab->size], s, len);
ab->str = new;
ab->size += len;
}
int main(void) {
abuf ab = {
NULL,
0
};
char *s = "Hello";
abAppend(&ab, s, 5);
abAppend(&ab, ", world", 7);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
一切都编译完毕,我的测试(为简单起见进行了编辑)显示字符串“Hello”存储在 …