我正在从一个文件中读取(每行输出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("%d\n",j);
ptr[j] = word[j]; //crashes here
j++;
}
ptr[j] = '\0'; //to here
size++;
}
i++;
}
printf("%s",ptr[0]); //but fails here
fclose(file);
答案 0 :(得分:0)
正如@Jagannath所提到的,您将ptr
变量视为二维数组。
实际上,您将其分配为一个简单的缓冲区。
示意:
ptr = [][][][][][][][][][][][][][\0];
然后,你有一个word
,它也是一个简单的缓冲区,如下所示:
word = [h][e][l][l][o][\0];
如果要将word
复制到ptr
,则需要迭代两个缓冲区并逐个字符地复制,如下所示:
word = [h][e][l][l][o][\0];
v v v v v
ptr = [h][e][l][l][o][][][][][][][][][\0];
否则,您可以通过创建二维数组来创建word
数组。
ptr = [|][|][][]...[\0]
v v
[h][w]
[e][o]
[l][r]
[l][l]
[o][d]
[0][0]
最后,您的代码中存在缺陷。查看您的malloc(1)
...并且您的wsize
永远不会被初始化,因此当您执行wsize = wsize+strlen(word);
时,行为未定义。
答案 1 :(得分:0)
此代码显示了一些关于指针如何工作的基本误解。 ptr[i]
相当于*(ptr+i)
。这在代码的上下文中没有任何意义。因此它应该是一个char,但是你要为它指定一个char的指针。并且printf失败了,当然它会失败。它需要一个指向char的指针,但它会获取ptr
指向的位置处的任何数据,并将其视为指针。这可能是一个禁止的内存位置,因此是段错误。即使它不是,它也不可能在超出边界之前到达空终止字节。