массивы — C ++ Seg Fault в конце функции. Контрольная линия = закрывающая скобка

В заключение: большое спасибо всем! Все ответы, размещенные ниже, были правильными. Первоначальной ошибкой было то, что я забыл оставить место для нулевого терминатора. 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, чтобы попытаться отладить его, и все работает правильно, пока он не попадет в фигурную скобку.

Я могу дать больше кода из программы, если это необходимо. Я не хочу публиковать все это, потому что это для класса.

1

Решение

Мое лучшее предположение, строка в 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

4

Другие решения

strcpy это опасная функция. Если длина входной строки SIZE_OF_ELEMENT или больше, вы будете писать после конца вашего temp массив. Если вы должны использовать массив фиксированного размера в качестве выходного массива в strcpy, вы должны проверить, что strcpy будет работать перед использованием функции.

Еще лучше перейти от использования char массивы в std::string,

2

Определяются ли данные следующим образом char data[SOME_CONSTANT]? Если так, то уверены ли вы, что SIZE_OF_ELEMENT достаточно велик? Вы тоже помните терминатор NULL, право?

Если в ArrayElement данные определены так char *data; и выделяется с помощью malloc позже, чем вы конечно что index1 имеет достаточно большой буфер для данных в index2 и наоборот? Опять же, вы тоже помните терминатор NULL, право?

0
По вопросам рекламы [email protected]