功能中malloc和sscanf引起的seg故障
我想打开一个文本文件(见下文),读取每行的第一个int并将其存储在一个数组中,但我遇到了一个分段错误。我去掉了所有的gcc警告,我阅读了在网上找到的几个教程,并搜索了stackoverflow的解决方案,但我不知道我做错了什么 当我把所有的东西都放在主函数中时(参见示例1),它就工作了,但当我把它转移到第二个函数时,它就不工作了(参见下面的示例2)。在示例2中,当我正确解释gdb时,我得到功能中malloc和sscanf引起的seg故障,c,arrays,pointers,malloc,segmentation-fault,C,Arrays,Pointers,Malloc,Segmentation Fault,我想打开一个文本文件(见下文),读取每行的第一个int并将其存储在一个数组中,但我遇到了一个分段错误。我去掉了所有的gcc警告,我阅读了在网上找到的几个教程,并搜索了stackoverflow的解决方案,但我不知道我做错了什么 当我把所有的东西都放在主函数中时(参见示例1),它就工作了,但当我把它转移到第二个函数时,它就不工作了(参见下面的示例2)。在示例2中,当我正确解释gdb时,我得到sscanf(行,“%I”,类[I])处的seg故障 恐怕这可能是件小事,但我已经在上面浪费了一天了 提前谢
sscanf(行,“%I”,类[I])处的seg故障代码>
恐怕这可能是件小事,但我已经在上面浪费了一天了
提前谢谢
[示例1]即使这适用于main中的所有内容:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
const int LENGTH = 1024;
int main() {
char *filename="somedatafile.txt";
int *classes;
int lines;
FILE *pfile = NULL;
char line[LENGTH];
pfile=fopen(filename,"r");
int numlines=0;
char *p;
while(fgets(line,LENGTH,pfile)){
numlines++;
}
rewind(pfile);
classes=(int *)malloc(numlines*sizeof(int));
if(classes == NULL){
printf("\nMemory error.");
exit(1);
}
int i=0;
while(fgets(line,LENGTH,pfile)){
printf("\n");
p = strtok (line," ");
p = strtok (NULL, ", ");
sscanf (line,"%i",&classes[i]);
i++;
}
fclose(pfile);
return 1;
}
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
const int LENGTH = 1024;
void read_data(int **classes,int *lines, char *filename){
FILE *pfile = NULL;
char line[LENGTH];
pfile=fopen(filename,"r");
int numlines=0;
char *p;
while(fgets(line,LENGTH,pfile)){
numlines++;
}
rewind(pfile);
* classes=(int *)malloc(numlines*sizeof(int));
if(*classes == NULL){
printf("\nMemory error.");
exit(1);
}
int i=0;
while(fgets(line,LENGTH,pfile)){
printf("\n");
p = strtok (line," ");
p = strtok (NULL, ", ");
sscanf (line,"%i",classes[i]);
i++;
}
fclose(pfile);
*lines=numlines;
}
int main() {
char *filename="somedatafile.txt";
int *classes;
int lines;
read_data(&classes, &lines,filename) ;
for(int i=0;i<lines;i++){
printf("\nclasses[i]=%i",classes[i]);
}
return 1;
}
这:
这可能是错误的。您也需要在此处取消引用,请尝试:
sscanf (line,"%i", &(*classes)[i]);
这是因为classes
是指向整数数组的指针。您需要其中一个整数的地址,以便sscanf()
可以在那里写入解析后的数字。因此,您必须首先取消引用类
以获取数组,然后说您想要该数组中元素编号i
的地址
你也可以使用
sscanf (line,"%i", *classes + i);
这可能更清楚,这取决于您对这些内容的熟悉程度。问题是,您在第一种情况下对int*应用[]运算符,在第二种情况下对int**应用[]运算符。int**类似于2d数组,当您将[]运算符与int**结合使用时,您将索引到int*数组中。在您的情况下,这不是您想要的,因为您只初始化此数组中的第一个条目。因此,当您访问类[1]时,它将崩溃,因为它未初始化。通过将指针作为引用而不是双指针传递,可以避免这种混淆:
int*& classes instead of int** classes
然后您可以使用与主函数相同的代码。谢谢,太快了!但我以前从未见过&(*foo)[bar]。它看起来应该和foo[bar]一样,但显然不是。什么意思?classes[i]
是一个int*
<代码>(*classes)
也是一个int*
,(*classes)[i]
是一个int
,而&(*classes)[i]
是该int
的地址。
sscanf (line,"%i", *classes + i);
int*& classes instead of int** classes