Имам странен проблем. Не мога да позная защо се случва. Опитвах по различни начини. Може да е така, защото все още съм начинаещ за 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