我正在尝试将大量数据存储到多个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 ++编译器。
存储大量数据的任何解决方案或替代方法。
对于我所犯的错误感到抱歉,我正在为所有值分配文件处理行指针。
答案 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一起变得可爱,因为每次都会咬你的屁股。