#arrays #c #function #pointers #malloc
Вопрос:
Проблема в программе возникает, когда malloc запускается несколько раз. Я получаю ошибку: SIGABRT (signal SIGABRT)
. Я рассматривал подобные вопросы, но пока ничего не помогло.
Программа проста, поэтому, если хотите, вы можете просто перейти к программе ниже. Я также дал объяснение, если оно вам может понадобиться.
пожалуйста, дайте мне знать, если у вас есть какие-либо вопросы, и я обязательно на них отвечу.
В программе объяснялось:
В основном у меня есть массив указателей (строка), где каждый указатель указывает на строку, представляющую строку. Затем я вызываю функцию для получения строк из входных данных.
Функция getlines имеет два цикла for, один внутри другого.
- Внешний цикл перемещается к следующему указателю в массиве указателей. Поскольку каждый указатель представляет собой строку, он перемещается на следующую строку в конце внутреннего цикла.
- Внутренний цикл добавляет символы до конца файла или до достижения новой строки. Он также проверяет, чтобы строка не превышала МАКСИМАЛЬНУЮ строку.
- В начале внутреннего цикла malloc используется для добавления указателя внутри массива, который будет ссылаться на строку (строку).
- Затем символы добавляются из входных данных и связываются с этим указателем.
Ниже приведена программа:
#include lt;stdio.hgt; #include lt;stdlib.hgt; #include lt;ctype.hgt; #define MAXLINES 100 #define MAXLINE 100 int main() { char *line[MAXLINES]; getlines(line); } void getlines(char **line){ int c = 0; char *l = 0; for(;c!= EOF; line ) { for (*line = NULL; (l - *line) != MAXLINE amp;amp; (c = getchar()) != EOF amp;amp; c != 'n'; l ) { if (*line == NULL) { *line = malloc(sizeof(char)); l = *line; } *l = c; } *l = ''; } *line = NULL; }
Еще раз спасибо 🙂
Комментарии:
1. чтобы избежать путаницы, я добавил Maxline и Maxlines, чтобы различать их
2. в комплекте отсутствуют…
3. @SobhanMohammadpour Они у меня были, забыл добавить их выше, просто добавил их.
4. Ваш код может выполнять следующую последовательность действий:
*line = malloc(sizeof(char)); l = *line; l ; *l = c;
. Это присваивается*l
, когдаl
точки выходят за пределы выделенного блока. Является ли проблема просто отсутствующей* MAXLINE
вmalloc
? /// Есть и другие проблемы.(l - *line) != MAXLINE
это неправильно. Вы хотите сравнить текущееline
значение с исходнымline
.5. @ikegami На самом деле, l увеличивается после *l = c; . Пожалуйста, взгляните на скобки и спасибо вам за вашу помощь. Ошибка происходит с malloc.
(l - *line) != MAXLINE
это просто вычисление общего расстояния. *линия указывает на начальную позицию, в то время как l будет указывать на новую позицию после увеличения