В заключение: большое спасибо всем! Все ответы, размещенные ниже, были правильными. Первоначальной ошибкой было то, что я забыл оставить место для нулевого терминатора. Strcpy () — опасная функция, потому что когда я ее использовал, он не знал, когда был конец «строки». Поэтому strcpy () захватил много данных и переписал обратный адрес.
РЕДАКТИРОВАТЬ: добавлено больше кода из программы
РЕШЕНО: Честно говоря, моей первоначальной реализацией было дерьмо. Я даже не знаю, почему я написал swap таким образом, если я хотел поменять местами элементы массива. (В то время у каждого элемента был только массив char. Так что я смог уйти со старой реализацией). Я переписал это:
void swap(ArrayElement list[], int index1, int index2) {
ArrayElement temp;
temp = list[index1];
list[index1] = list[index2];
list[index2] = temp;
}
У меня проблемы с ошибкой сегментации в конце следующей функции.
struct ArrayElement {
char data[SIZE_OF_ELEMENT];
// Implemented this way so that I can expand to multiple values later on
}
//In main:
ArrayElement* list = new ArrayElement[NUM_OF_ELEMENTS];
void swap(ArrayElement list[], int index1, int index2) {
char temp[SIZE_OF_ELEMENT];
strcpy(temp, list[index2].data);
strcpy(list[index2].data, list[index1].data);
strcpy(list[index1].data, temp);
}
Ошибка — ошибка сегментации в строке 45, которая является конечной фигурной скобкой функции. Это было скомпилировано с использованием g ++. Я использовал gbd, чтобы попытаться отладить его, и все работает правильно, пока он не попадет в фигурную скобку.
Я могу дать больше кода из программы, если это необходимо. Я не хочу публиковать все это, потому что это для класса.
Мое лучшее предположение, строка в list[index2].data
больше чем temp[]
и копируя, вы перезаписали стек и адрес возврата.
Попробуйте вставить тест на длину:
#include <iostream>
...
int n = strlen(list[index2].data);
std::cerr << "len=" << n << ", SIZE_OF_ELEMENT=" << SIZE_OF_ELEMENT << std::endl;
и посмотрим, если n
(list [index2] .data) больше чем SIZE_OF_ELEMENT
strcpy
это опасная функция. Если длина входной строки SIZE_OF_ELEMENT
или больше, вы будете писать после конца вашего temp
массив. Если вы должны использовать массив фиксированного размера в качестве выходного массива в strcpy
, вы должны проверить, что strcpy
будет работать перед использованием функции.
Еще лучше перейти от использования char
массивы в std::string
,
Определяются ли данные следующим образом char data[SOME_CONSTANT]
? Если так, то уверены ли вы, что SIZE_OF_ELEMENT достаточно велик? Вы тоже помните терминатор NULL, право?
Если в ArrayElement данные определены так char *data;
и выделяется с помощью malloc позже, чем вы конечно что index1 имеет достаточно большой буфер для данных в index2 и наоборот? Опять же, вы тоже помните терминатор NULL, право?