У меня есть аналогичная проблема, такая как этот вопрос, и моя проблема была решена аналогично этот ответ, но я не могу понять, что вызвало эту проблему. У меня есть три структуры File
, Line
и Buffer
, объявленные в app.h
.
typedef struct File {
FILE *fs;
char *path;
size_t size;
} File;
typedef struct Line Line;
struct Line {
char *text;
size_t len;
size_t line_no;
Line *next;
Line *prev;
};
typedef struct Buffer {
int id;
File file;
Line *first;
Line *last;
Line *current;
int x_pos;
int y_pos;
int visual_x;
bool modified;
} Buffer;
Makefile
выглядит следующим образом:
CC = gcc
CFLAGS = -Wall -Werror -g
LDFLAGS =
LDLIBS = -lcurses
OBJECTS = app.o io.o global.o move.o winio.o utils.o
all: app
app: $(OBJECTS)
$(CC) $(LDFLAGS) $(OBJECTS) $(LDLIBS) -o $@
%.o: %.c proto.h app.h
$(CC) $(CFLAGS) -c $<
.PHONY: clean
clean:
-rm app
-rm *.o
Существует глобальный указатель для структуры Buffer
: extern Buffer *buffer
объявлено в proto.h
и определено в global.c
, а *buffer
динамически размещено в io.c
. В io.c
есть несколько функций, которые работают с *buffer
. Я переместил функцию show_buffer()
модуля io.c
в другой модуль, например winio.c
.
void show_buffer()
{
size_t i = 0, j = 0;
Line *it;
for (it = buffer->first; it != NULL && i < (LINES - STATBAR_HEIGHT);
it = it->next, i++) {
for (j = 0; it->text[j] != '\0'; j++) {
waddch(mainwin, it->text[j]);
}
}
}
и я также удалил size
член структуры File
. Потом show_buffer()
в winio.c
уже не работало. Я обнаружил, что show_buffer()
работает с поврежденным указателем buffer->first
. Я перекомпилировал каждый модуль, но это не сработало.
Проблема была решена, когда я снова добавил size
элемент структуры File
. Я также понял, что если я верну show_buffer()
обратно в io.c
, проблема будет решена. Я подозреваю, что заполнение структуры может вызвать проблему.
Мой вопрос в том, что вызвало проблему и как ее избежать.
Разрешение
Предварительно скомпилированный заголовок вызывал проблемы, потому что он не перекомпилировался.
make clean && make
в Linux)? - person rlbond   schedule 18.02.2015app.h
,proto.h
,gobal.c
[sic],io.c
,winio.c
). Вы уверены, что правильно все перекомпилировали? Один из способов получить повреждение — перекомпилировать некоторые, но не все файлы. Вокруг много указателей; все ли они должным образом инициализированы перед использованием. Откровенно говоря, это достаточно запутанно, чтобы на него нельзя было ответить. Вам нужно будет показать MCVE (как упоминалось ранее), но это не будет тривиальным предложением. - person Jonathan Leffler   schedule 18.02.2015show_buffer()
обратно в исходный модуль, либо повторным добавлениемsize
членаFile
структуры. Эта проблема воспроизводима. - person ziggurat   schedule 18.02.2015struct
. Вероятно, у вас есть некоторые повреждения памяти. Используйте такие инструменты, как valgrind иgdb
- person Basile Starynkevitch   schedule 18.02.2015valgrind
? Вы выполняете много связанных списков и другую работу, которая должна включать динамическое выделение памяти;valgrind
укажет, злоупотребляете ли вы динамически выделенной памятью. - person Jonathan Leffler   schedule 18.02.2015valgrind
, и об ошибках не сообщалось. - person ziggurat   schedule 18.02.2015