我正在尝试动态创建一个2d数组,然后打开一个txt文件,复制每个宽松的2d数组。然后将此数组保存回我的main。我一直遇到分段错误。有什么建议如何修复此代码吗?顺便说一句,我认为问题出现在第二次循环之后。。。
#include<stdio.h>
char **randomArrayofStrings(){
char **twoArray=null;
int rows=50;
int col=20;
i=0;
FILE *file=null;
int messageSize=50;//this is number is trivial
file = fopen("somefile.txt","r");
twoArray= malloc(rows*sizeof(char*));
for(i=0;i<col;i++)
{
twoArray[i]=malloc(rows*sizeof(char));
strcpy(twoArray[i], "some random word");
}
while(!feof(file))
{
fgets(dArray[i],messageSize, file);
strtok(dArray[i], "n");
i++;
}
return twoArray;
}
int main(int argc, char **argv)
{
char **localArray=null;
localArray=randomArrayofStrings();
for(i=0;i<20;i++)//20 is just a random number
printf("Strings: %s", localArray[i]);
}
如我所见,在函数randomArrayofStrings
中,循环for
遍历代码中的列"I cols"。因此,您首先分配指针数组并将其视为cols
,然后在循环中分配rows
。
在malloc
之后,检查返回的值,如果在内存分配后指针为NULL,则不要使用指针。
要释放已分配的内存,请使用反向序列-在循环中释放所有rows
,而不是释放一次cols
。例如:
for(i=0;i<col;i++){
free(twoArray[i]);
}
free(twoArray);
twoArray = NULL;
编辑:
此外,要使用malloc
和free
,需要#include <stdlib.h>
,#include <string.h>
用于strcopy
,int i=0;
应该代替i=0;
,指针的正确空值为NULL
。
什么是dArray
?我看不到声明或定义?你是说twoArray
吗?
第2版:
以下是我的程序版本:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char **randomArrayofStrings(){
char **twoArray=NULL;
char * ptr = NULL;
int rows=50; // this will be also message size
int cols=20;
int i=0;
FILE *file=NULL;
file = fopen("somefile.txt","r");
if( file == NULL )
return NULL;
twoArray = (char**) malloc(cols * sizeof(char*));
if(twoArray == NULL)
{
return NULL;
}
for(i=0;i<cols;i++)
{
twoArray[i] = (char*)malloc(rows*sizeof(char));
if(twoArray[i] == NULL)
return NULL;
strcpy(twoArray[i], "some random word");
}
i = 0; // reset counter
while(!feof(file))
{
fgets(twoArray[i], rows, file);
ptr = strchr(twoArray[i],'n');
if( ptr )
*ptr = ' ';
else
twoArray[i][rows-1] = ' ';
i++;
if( i >= cols)
break;
}
fclose(file);
return twoArray;
}
void freeMy2dArray(char **twoArray, int n)
{
int i;
for(i=0; i < n; i++){
free(twoArray[i]);
}
free(twoArray);
twoArray = NULL;
}
int main(int argc, char **argv)
{
int i;
char **localArray=NULL;
localArray = randomArrayofStrings();
if( localArray == NULL )
return 1;
for(i=0;i<20;i++)//20 is just a random number
printf("Strings: %sn", localArray[i]);
freeMy2dArray(localArray, 20);
}
您在randomArrayofStrings()
中不被假定为free()
twoArray
。一旦你用完了分配的纪念物,你就必须在main()
中释放它们。
也就是说,在main()
中使用sizeof(localArray)
的方式是错误的。您必须使用您在填充twoArray
时使用的确切值。