Это проблема, связанная с изучением C hardway. Это система управления базами данных в C У меня есть три структуры: -Инициализация вложенной структуры
struct Address {
int id;
int set;
char *name;
char *email;
};
struct Database {
int rows;
struct Address *row;
};
struct Connection {
FILE *file;
struct Database *db;
};
Я пытаюсь инициализировать структуру базы данных. Однако я получаю segfault
void Database_create(struct Connection *conn, int no_of_rows)
{
int i = 0;
conn->db->row_num = no_of_rows;
for(i = 0; i < conn->db->row_num; i++) {
// make a prototype to initialize it
struct Address addr;
addr.id = i;
addr.set = 0;
// then just assign it
conn->db->rows[i] = addr;
}
}
Я сделал еще одну функцию, которая выделяет память этим структурам.
struct Connection *Database_open(const char *filename, char mode)
{
struct Connection *conn = malloc(sizeof(struct Connection));
if(!conn) die("Memory error");
int number = conn->db->rows;
conn->db = malloc(sizeof(struct Database));
if(!conn->db) die("Memory error");
conn->db->row = malloc(sizeof(*conn->db->row) * number);
if(!conn->db->row) die("Memory error");
if(mode == 'c') {
conn->file = fopen(filename, "w");
} else {
conn->file = fopen(filename, "r+");
if(conn->file) {
Database_load(conn);
}
}
if(!conn->file) die("Failed to open the file");
return conn;
}
Valgrind говорит: «Использование неинициализированного значения размера 4» в Database_open()
Можно ли предположить, что я могу делать неправильно здесь?
Почему вы используете 'rows' в качестве массива, когда это просто' int'? – tay10r
Используйте отладчик, чтобы узнать, что вызывает segfault. Скорее всего, 'conn-> db' не инициализирован или что-то –
@Ajit вы должны указать, как вы вызываете' Database_create' – tay10r