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



我正试图将大量数据存储到多个malloc数组中我有三个malloc数组,两个2d char数组和一个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));

我从文件中读取了数据。存储在这些数组中的数据,如果按存储在这些阵列中的方式打印,则格式正确。但是,当我尝试从字符数组中检索数据时,在为int数组赋值后,字符;数组将列长度更改为14,值设置为8.50000000E-01。

我使用的是Linux Opensuse和g++comiler。

存储大量数据的任何解决方案或替代方法。

很抱歉造成了所有的混乱,我的错误是我把文件处理行指针分配给了所有的值。

因此matm是长度为catmchar*的数组。然后为其元素指定长度为5的char数组。然后对res而不是atm执行相同操作。

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

几乎可以肯定的是,您正在溢出其中一个数组。您可以使用valgrind来确定哪一个,很可能是自动的,只需运行valgrind ./a.out或任何程序的调用即可。它将打印发生内存错误的堆栈跟踪。

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

由于您使用的是C++编译器,因此应该考虑使用像std::vector<char>std::string这样的C++容器,而不是像您发现的那样容易出错的原始C数组。

好的,所以我要尝试一下。。。在C!

您正在制作的是指向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*]) ;
}

不要试图和C一起变得可爱,因为它每次都会咬你的屁股。

最新更新