Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
功能中malloc和sscanf引起的seg故障_C_Arrays_Pointers_Malloc_Segmentation Fault - Fatal编程技术网

功能中malloc和sscanf引起的seg故障

功能中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故障 恐怕这可能是件小事,但我已经在上面浪费了一天了 提前谢

我想打开一个文本文件(见下文),读取每行的第一个int并将其存储在一个数组中,但我遇到了一个分段错误。我去掉了所有的gcc警告,我阅读了在网上找到的几个教程,并搜索了stackoverflow的解决方案,但我不知道我做错了什么

当我把所有的东西都放在主函数中时(参见示例1),它就工作了,但当我把它转移到第二个函数时,它就不工作了(参见下面的示例2)。在示例2中,当我正确解释gdb时,我得到
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