C - "分段错误:11"运行程序

时间:2015-01-07 18:27:08

标签: c gcc segmentation-fault

当我运行它时,该程序返回“Segmentation fault:11”。编译器(GCC)不会返回任何错误或警告。

#include <stdio.h>
#include <string.h>

typedef struct {
  char day[3];
  char month[3];
  char year[5];
} DATA;

DATA *data;

int main()
{
  FILE *file;
  char line_buffer[BUFSIZ];

  if (!(file = fopen("file.dat", "rt")))
  { 
    printf ("Something went wrong while opening the file.\n");
  }
  else
  {
    int line_number = 0;

    while (fgets(line_buffer, sizeof(line_buffer), file))
    {
      ++line_number;

      if      (line_number == 1) { strncpy(data->day,   line_buffer, 2); }
      else if (line_number == 2) { strncpy(data->month, line_buffer, 2); }
      else if (line_number == 3) { strncpy(data->year,  line_buffer, 4); }
    }

    printf("Content: %s-%s-%s\n", data->day, data->month, data->year); 
  }
  return 0;
}

file.dat的内容是:

12
08
1990

我用GDB调试了它,结果就是这样:

(gdb) run
Starting program: /Users/macuser/Desktop/Primitiva/Proyecto/a.out
Program received signal SIGSEGV, Segmentation fault.
0x00007fff949413a0 in _dispatch_queue_attrs () from /usr/lib/system/libdispatch.dylib

这意味着什么,我该怎么做才能解决问题?谢谢!

2 个答案:

答案 0 :(得分:2)

请注意,虽然使用malloc会起作用,但对您来说这是一项不必要的额外工作,因为当您不再需要使用{{1}时,您也必须稍后致电free结构。但为此,您应该将变量设为data

这应该可以解决您的问题

main()

在这种特殊情况下,您不需要将typedef struct { char day[3]; char month[3]; char year[5]; } DATA; DATA data; /* ^ no star here, because you don't need a pointer in your particular case */ int main() { FILE *file; char line_buffer[BUFSIZ]; if (!(file = fopen("file.dat", "rt"))) { printf ("Something went wrong while opening the file.\n"); } else { int line_number = 0; while (fgets(line_buffer, sizeof(line_buffer), file)) { ++line_number; if (line_number == 1) { strncpy(data.day, line_buffer, 2); } else if (line_number == 2) { strncpy(data.month, line_buffer, 2); } else if (line_number == 3) { strncpy(data.year, line_buffer, 4); } } printf("Content: %s-%s-%s\n", data.day, data.month, data.year); } return 0; } 声明为指针,如果您没有正确理解动态内存分配,那么它会更好,{{ 1}}变量不需要是全局变量,您可以在data函数内声明它。

分段错误是由无效的指针取消引用引起的,如果你想使用指针那么这就是你应该这样做的方式

data

答案 1 :(得分:0)

您忘记为结构分配内存

DATA *data = malloc(sizeof(DATA));

在向内容写入内容之前,应该为指针分配内存。