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

时间:2015-02-10 04:39:43

标签: c++ arrays 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数组后的字符; array将列长度更改为14,并将值设置为8.50000000E-01。

我正在使用Linux Opensuse和g ++编译器。

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

对于我所犯的错误感到抱歉,我正在为所有值分配文件处理行指针。

2 个答案:

答案 0 :(得分:0)

所以matm是一个char*数组,长度为catm。然后,为其元素分配长度为char的数组。然后,对res而不是atm执行相同的操作。

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

几乎可以肯定你会溢出其中一个数组。您可以使用valgrind通过简单地运行valgrind ./a.out或调用您的程序来自动确定哪些是自动的。它将打印出现内存错误的堆栈跟踪。

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

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

答案 1 :(得分:0)

好的,所以我将在C中采取行动......

你正在制作的是char的指针数组。

所以两个指向char的指针数组,每个指针都有41241个指向char

的指针

一个数组保存指向int的指针(虽然为什么我不知道因为只是声明一个大小为12163的int数组就可以了。

此外,您将char指针数组上的每个条目声明为5个字符,这些字符将包含4个字节的C样式字符串以及空终止符。

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一起变得可爱,因为每次都会咬你的屁股。