C++ 成功将大型Malloc阵列数据分配到内存后丢失

C++ 成功将大型Malloc阵列数据分配到内存后丢失,c++,arrays,malloc,C++,Arrays,Malloc,我试图将大量数据存储到多个malloc数组中 我有三个malloc数组,两个2d字符数组和一个int数组。在测试用例中,数组名称定义为: cres=12163; catm=41241; matm = (char**) malloc(catm*sizeof(char*)); for(i=0;i<catm;i++) matm[i]=(char*) malloc(5*sizeof(char)); mres = (char**) malloc(cres*sizeof(char*));

我试图将大量数据存储到多个malloc数组中 我有三个malloc数组,两个2d字符数组和一个int数组。在测试用例中,数组名称定义为:

cres=12163;
catm=41241;
matm = (char**) malloc(catm*sizeof(char*));
for(i=0;i<catm;i++)
      matm[i]=(char*) malloc(5*sizeof(char));
mres = (char**) malloc(cres*sizeof(char*));
for(i=0;i<cres;i++)
      mres[i]=(char*) malloc(5*sizeof(char));
mrin = (int*) malloc(cres*sizeof(int));
cres=12163;
catm=41241;
matm=(char**)malloc(catm*sizeof(char*);

对于(i=0;iSo
matm
是长度为
catm
char*
数组。然后将长度为5的
char
数组分配给其元素。然后对
res
而不是
atm
执行相同的操作

最后,在
mrin
中分配并存储
cres
整数数组

几乎可以肯定的是,您正在溢出这些数组中的一个。您可以使用
valgrind
通过简单地运行
valgrind./a.out
或您的程序调用的任何程序来确定最有可能是自动溢出的数组。它将在出现内存错误时打印堆栈跟踪

您可能只是拥有长度超过4个字符的字符串(加上终止null)。您不会显示填充数组的代码


<> P>由于使用C++编译器,应该考虑使用C++容器,如“代码> STD::vector < /C>”和:ST::String < /C> >而不是原来发现的易出错的C C数组。

< P> OK,所以我将在C…< /P>中对此进行破解。 您所做的是指向char的指针数组

两个指向char的指针数组,每个数组包含41241个指向char的指针

一个数组包含指向int的指针(尽管我不知道为什么,因为只声明一个大小为12163的int数组就可以了)

此外,您要将char指针数组上的每个条目声明为5个字符,其中包含一个4字节的C样式字符串加上null终止符

char* strArray1 [41241] ;
char* strArray2 [41241] ;
int* intArray [12163] ;

for( int x=0 ; int < 41241;x++){
     strArray1[x] = malloc(5*sizeof(char)) ;
     strcopy("fred",strArray1[x]);
}

for( int x=0 ; int < 41241;x++){
     strArray2[x] = malloc(5*sizeof(char)) ;
     strcopy("Tom",strArray2[x]);
}

for(x=0;x<12163;x++){
     inArray[x*] = rand() % 50 ;
}

for( int x=0 ; int < 41241;x++){
     printf(" This entry = %s \n",strArray1[x]) ;
}

for( int x=0 ; int < 41241;x++){
     printf(" This entry = %s \n",strArray2[x]) ;
}

for( int x=0 ; int < 12163;x++){
     printf(" This entry = %i \n",intArray[x*]) ;
}
char*strArray1[41241];
char*strArray2[41241];
int*intArray[12163];
对于(int x=0;int<41241;x++){
strArray1[x]=malloc(5*sizeof(char));
strcopy(“fred”,strArray1[x]);
}
对于(int x=0;int<41241;x++){
strArray2[x]=malloc(5*sizeof(char));
strcopy(“Tom”,strArray2[x]);
}

对于(x=0;x),这应该是一个“C”问题,而不是“C++”添加一个标签用于<代码> C>代码>。尝试使用ValgReND或GDB来调试出错或不期望的信息。这是一小块信息。如果你可以发布一个,它会帮助其他人找出问题所在。这是我最近看到的最坏的问题。你使用C还是C++,请只选择1。@ FLUIN。GoGe:注意,OP说他使用C++编译器,把问题标记为C++。另外还有人添加了<代码> C<代码>标签。我通常在编程中混合C和C++编码风格,如果它引起一些混乱,我不能修复数组长度,我刚才提到它是一个测试案例。我在头文件之后使用命名空间STD。我不喜欢。每次都提到容器。正如我之前提到的,如果分配给另一个malloc数组的值,字符数组会被分配一些丢失(“未替换”)其原始内容的值。我想问的是,这个问题有什么解决方案,或者我必须求助于其他策略来解决这个问题吗?@SaadRaza,你正在失去我“迷路了"如果数据不丢失,指针的有效性或不可。如果你在不释放内存的情况下运行两次代码,而你使用C,那么你每次都会造成内存泄漏。如果你指望C++来收集垃圾,那么你不会。混合C和C++你的麻烦。我说的使用一个或另一个。请解释一下。你所说的“迷失”是什么意思。