У меня странная проблема. Я не могу предположить, почему это происходит. Я пробовал разными способами. Может быть, это потому, что я все еще новичок в языке c.
Пожалуйста, посмотрите на приведенный ниже код.
Он поставляется с 2 аргументами. --write
и --read
.
В моей функции
write()
я пишу в файл, а затем вызываю функциюread()
. Это записывает данные в файл и правильно печатает 3 строки значений, как и ожидалось.В моей функции
read()
я прочитал файл. Когда я передаю только аргумент--read
, программа выдает сообщение об ошибкеsegmentation fault
. Хотя в приведенном ниже коде, если я назначу значение статической строкиchar *name
, эта функция чтения работает, как и ожидалось.
Ниже приведен мой полный код, который я создал для имитации моей проблемы.
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef struct _student {
int id;
char *name;
} Student;
void write();
void read();
int main(int argc, char *argv[])
{
if (argc > 1) {
if (strcmp(argv[1], "--write") == 0) {
write();
read();
}
else if (strcmp(argv[1], "--read") == 0) {
read();
}
}
return 0;
}
void write()
{
printf("Write\n");
FILE *fp;
// write student
Student *std_writer = (Student *) malloc(sizeof(Student));
std_writer->id = 10;
//std_writer->name = "Alice"; // But if i remove the below 4 lines and uncommented this line, everything works as expected.
char *a = "Alice";
std_writer->name = malloc(20);
memset(std_writer->name, '\0', 20);
strncpy(std_writer->name, a, 5);
fp = fopen("Student.file", "wb");
fwrite(std_writer, sizeof(Student), 1, fp);
fwrite(std_writer, sizeof(Student), 1, fp);
fwrite(std_writer, sizeof(Student), 1, fp);
fclose(fp);
free(std_writer);
}
void read()
{
printf("Read\n");
FILE *fp;
// read student
Student *std_reader = (Student *) malloc(sizeof(Student));
fp = fopen("Student.file", "rb");
while(fread(std_reader, sizeof(Student), 1, fp) == 1) {
printf("ID %i \tName : %s\n", std_reader->id, std_reader->name);
}
fclose(fp);
free(std_reader);
}
пожалуйста, помогите мне понять и решить эту проблему.
ИЗМЕНИТЬ
Хорошо. Согласно приведенным ниже ответам, как я понял, я обновил свою структуру Student следующим образом.
typedef struct _student {
int id;
char name[20];
} Student;
Это работает.
Любые комментарии ?
name
должен оставаться указателем или быть гибким элементом массива. - person Basile Starynkevitch   schedule 16.03.2014name
имел фиксированный размер, по крайней мере, сделайте его намного длиннее (64 байта, а не 20). Но не стоит делать его фиксированного размера! - person Basile Starynkevitch   schedule 16.03.2014