Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/150.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用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 - Fatal编程技术网

使用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”); 不能

使用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()返回的地址 还有一个问题-最初分配

In

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 和 ReLoCU >是C风格的东西。如果你使用C++,你应该尝试<代码>新< /代码>和<代码>删除< /代码>,并且可能使用<代码> String 类型来存储字符串。

< p>你的代码有很多问题。首先,如果你是程序员,你不应该使用<代码> MalOC 和朋友。C++中的g,

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++版本中,你将使用String < /C> >而不是计划旧的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]而不是简单的<代码> G< <代码> .< /P>如果你正在学习C++,你应该使用<代码>新< /C> >和<代码>删除< /代码>。所有的Gurur:请考虑回答我读文件部分的方法。这是有意义的。谢谢SeaPress的Advestee回答,我还要提到2个字符不足以容纳“AB”。由于Sinan的注释使用空终止符+1,但是std::vector或std::string可能对您更有用,因为您无法重新分配新的内存(请查看resize方法)可以解释一下你最后一段的解决方案吗?如果安全处理,为什么realloc不能使用。如果要正确调用上面的代码,它应该检查
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