使用realloc动态内存重新分配 我正在学习C++。我试图学习这种动态内存分配。在下面的代码中,我尝试使用malloc和realloc分配内存 int main (void) { char *g = (char*) malloc (sizeof(char) * 2); g = "ab"; g = (char*) realloc (g, sizeof(char) * 200); strcpy (g, "cdefg"); cout << g << endl; return 0; } int main(无效){ char*g=(char*)malloc(sizeof(char)*2); g=“ab”; g=(char*)realloc(g,sizeof(char)*200); strcpy(g,“cdefg”); 不能
In 将使用realloc动态内存重新分配 我正在学习C++。我试图学习这种动态内存分配。在下面的代码中,我尝试使用malloc和realloc分配内存 int main (void) { char *g = (char*) malloc (sizeof(char) * 2); g = "ab"; g = (char*) realloc (g, sizeof(char) * 200); strcpy (g, "cdefg"); cout << g << endl; return 0; } int main(无效){ char*g=(char*)malloc(sizeof(char)*2); g=“ab”; g=(char*)realloc(g,sizeof(char)*200); strcpy(g,“cdefg”); 不能,c++,memory-leaks,memory-management,C++,Memory Leaks,Memory Management,In 将g指向位于静态存储中的块,而不是堆上的块,然后在 g = (char*) realloc (g, sizeof(char) * 200); 您尝试使用堆外的地址调用realloc()。这是未定义的行为,会使程序崩溃。您只能使用malloc()或realloc()(或空指针)返回的地址调用realloc() 问题是你的意思是: strcpy( g, "ab" ); 但错误地写道: g = "ab"; 前者可以正常工作-g最初设置为malloc()返回的地址 还有一个问题-最初分配
g
指向位于静态存储中的块,而不是堆上的块,然后在
g = (char*) realloc (g, sizeof(char) * 200);
您尝试使用堆外的地址调用realloc()
。这是未定义的行为,会使程序崩溃。您只能使用malloc()
或realloc()
(或空指针)返回的地址调用realloc()
问题是你的意思是:
strcpy( g, "ab" );
但错误地写道:
g = "ab";
前者可以正常工作-g
最初设置为malloc()
返回的地址
还有一个问题-最初分配的内存太少。应该为空终止符分配一个额外的字节。问题在于行:
g = "ab";
将g
指针完全设置为另一个位置。它不会复制内容。您会失去对原始位置的跟踪,当您在realloc
中使用realloc
时,您将使用错误的指针
将线路替换为:
strcpy(g, "ab");
当然,您需要三个字节来存储字符串和终止的'\0'
字符
<>代码>代码> Malc 和
char *g = (char*) malloc (sizeof(char) * 2);
g = "ab";
oops.您刚刚丢失了malloc
调用返回的2字节内存,因为现在g
指向存储“ab”
的可能只读位置
g = (char*) realloc (g, sizeof(char) * 200);
只能对先前的malloc
返回的指针调用realloc
int main (void) {
char *g = (char*) malloc (sizeof(char) * 2);
g = "ab";
g = (char*) realloc (g, sizeof(char) * 200);
strcpy (g, "cdefg");
cout << g << endl;
return 0;
}
即使您传递了指向realloc
的有效指针,如果重新分配失败,realloc
也可能返回NULL。在这种情况下,先前分配的内存仍保持已分配状态,但您将覆盖指向该内存的唯一变量,从而无法释放先前的分配。请参阅C FAQ列表中的
另外,请注意,“ab”
需要三个字节的存储空间,而不是两个字节。最后,sizeof(char)
始终和处处为1,因此在malloc
调用中不需要使用sizeof(char)
程序的正确C版本如下所示:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main (void) {
char *tmp;
char *g = malloc(3);
if ( !g ) {
return EXIT_FAILURE;
}
strcpy(g, "ab");
tmp = realloc (g, 200);
if ( !tmp ) {
return EXIT_FAILURE;
}
g = tmp;
strcpy (g, "cdefg");
puts(g);
return 0;
}
#包括
#包括
#包括
内部主(空){
char*tmp;
char*g=malloc(3);
if(!g){
返回退出失败;
}
strcpy(g,“ab”);
tmp=realloc(g,200);
如果(!tmp){
返回退出失败;
}
g=tmp;
strcpy(g,“cdefg”);
put(g);
返回0;
}
<>在C++版本中,你将使用<>但是,注意代码也有“强> c<强”,我确信C++中有更好的方法来做你想要的。我不知道C++标准库中的C++给你一个正确的解决方案。 你需要把原来的Maloc增加到3,以包含null终止符,并使用StrucPy将内容设置为“ab”< /p>
关于你问题的第二部分: 考虑使用
std::vector
std::vector<char> g;
g.resize(1024);
// fill up g
// decide you need another hundred bytes at the end of g
g.resize(1124);
// memory will automatically be released when g goes out of scope
std::向量g;
g、 调整大小(1024);
//加满
//决定在g的末尾还需要100个字节
g、 调整大小(1124);
//当g超出范围时,内存将自动释放
请注意,要将指针传递到缓冲区的开头,您现在必须说
&g[0]
malloc
的返回值,并确保它不是NULL
。谢谢Sinan,这是一个很大的帮助!!这是一个非常好的回答问题是,如果我必须从ifst文件读取数据ream.read只接受char*而不是std::string。所以,你不能跳过上面的方法……对吗?我建议使用std::vector
,而不是std::string
,&g[0]
是一个char*
可以传递给ifstream::read()
。我不确定我是否理解你的问题。
std::vector<char> g;
g.resize(1024);
// fill up g
// decide you need another hundred bytes at the end of g
g.resize(1124);
// memory will automatically be released when g goes out of scope