当我运行它时,该程序返回“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
这意味着什么,我该怎么做才能解决问题?谢谢!
答案 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));
在向内容写入内容之前,应该为指针分配内存。