我正在从文件中读取(每行有 1 个单词(并将每一行放入数组中。但是,每当我尝试访问数组中的任何元素时,我都会遇到分段错误。非常感谢对此的任何帮助。*更新:添加了一个while循环来逐个抓取字符,但我仍然遇到分段错误
指针是在这里制作的:
char* ptr;
我通过函数传递了它,如下所示:
fillDict(ptr,&size);
int fillDict(char* ptr,int *size)
它读取文件并将其放入此处的数组中:
int i = -1;
int numb;
int wsize;
while (fgets(word,30,file)!=NULL)
{
if (i==-1)
{
if(word[strlen(word)-1]=='n')
{
word[strlen(word)-1] = 0;
}
numb = atoi(word);
ptr = malloc(sizeof(char));
}
else
{
if(word[strlen(word)-1]=='n')
{
word[strlen(word)-1] = 0;
}
wsize = wsize+strlen(word);
ptr = realloc(ptr,wsize);
int j = 0; //added from here
while(j<strlen(word)-1)
{
printf("%dn",j);
ptr[j] = word[j]; //crashes here
j++;
}
ptr[j] = ' '; //to here
size++;
}
i++;
}
printf("%s",ptr[0]); //but fails here
fclose(file);
正如@Jagannath提到的,您将ptr
变量视为二维数组。
实际上,您可以将其分配为简单的缓冲区。
示意图:
ptr = [][][][][][][][][][][][][][ ];
然后,您有一个word
,它也是一个简单的缓冲区,如下所示:
word = [h][e][l][l][o][ ];
如果要将word
复制到ptr
,则需要遍历缓冲区并逐个字符复制,如下所示:
word = [h][e][l][l][o][ ];
v v v v v
ptr = [h][e][l][l][o][][][][][][][][][ ];
否则,您可以通过创建二维数组来创建word
数组。
ptr = [|][|][][]...[ ]
v v
[h][w]
[e][o]
[l][r]
[l][l]
[o][d]
[0][0]
最后,你的代码有缺陷。看看你的malloc(1)
...而且您的wsize
永远不会初始化,因此当您执行此操作wsize = wsize+strlen(word);
行为时,行为是未定义的。
这段代码显示了关于指针如何工作的一些基本误解。 ptr[i]
相当于*(ptr+i)
。这在代码上下文中毫无意义。因此,它应该是一个字符,但您正在分配一个指向它的字符的指针。而失败的printf,当然会失败。它需要一个指向 char 的指针,但它获取ptr
指向的位置的任何数据,并将其视为指针。这可能是一个禁止的内存位置,因此存在段错误。即使不是,也不太可能在超出边界之前达到空终止字节。