无法理解为什么我会遇到段错误

时间:2016-01-26 04:07:46

标签: c++ segmentation-fault

我在堆栈上使用的内存非常少,而且我没有递归,并且所有内存访问都在堆栈中。那么为什么我会遇到段错误呢?

#include <iostream>
#include <string>
#include <stdio.h>
using namespace std;

int main(int argc, char *argv[]){
  FILE *file = fopen("test.cpp", "r");
  struct item{
    char *type;
    int price;
    bool wanted;
  };
  item items[100]; char *temp;
 if (file)
   cout << "works up to here" << endl;
  fscanf(file,
     "%s, %[for sale wanted], %d",
     items[0].type,
     temp,
     &items[0].price);
}

打印出来

works up to here
Segmentation fault (core dumped)

4 个答案:

答案 0 :(得分:2)

您正在传递未初始化的{x: 100, y: 1}指针。你需要做这样的事情: (如果你使用C)

{y: 1, x: 100}

(如果您实际使用的是C ++)

fscanf

答案 1 :(得分:1)

scanf()函数不会分配任何内存。从它的外观来看,你将未初始化的指针传递给fscanf(),其中函数需要足够大小的数组。

很可能你会使用像

这样的东西
items[0].type = new char[100];
char temp[20];
if (3 == fscanf("%100s, %[for sale wanted], %d",
              items[0].type,
              temp,
              &items[0].price)) {
    // deal with a read item
}
else {
    // deal with an input error
}

(我不太熟悉fscanf()对中间格式说明符有信心。)

答案 2 :(得分:0)

您是否检查file指针是否为空?

这是fopen reference doc

  

如果文件成功打开,则该函数返回指向   一个FILE对象,可用于在将来标识流   操作

     

否则,返回空指针。

正如凯文所说,这更像是C而不是C ++

答案 3 :(得分:0)

我看到了几个问题。

  1. 您没有检查fopen()是否成功。
  2. 您正在尝试阅读尚未初始化为{1}的items[0].type
  3. 最好使用std::ifstreamstd::string,而不是使用FILE*char*