结论:非常感谢大家!下面发布的所有答复都是正确的。最初的错误是我忘记了为空终结者留出空间。strcpy()是一个危险的函数,因为当我使用它时,它不知道"字符串"的末端是何时。因此,strcpy()抓住了大量数据并覆盖返回地址。
编辑:从程序中添加了更多代码
解决:老实说,我最初的实施是胡扯。我什至不知道为什么要换成数组的元素,为什么要以这种方式写交换。(当时,每个元素都只有一个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
(列表[index2] .data)大于 SIZE_OF_ELEMENT
strcpy
是一个危险功能。如果输入字符串的长度为SIZE_OF_ELEMENT
或更多,则将在temp
数组的末端编写。如果您必须使用固定大小数组作为strcpy
中的输出数组,则应测试strcpy
在使用函数之前是否可以正常工作。
更好的是从使用char
数组转到std::string
。
数据定义的 char data[SOME_CONSTANT]
是否定义?如果是这样,那么您确定size_of_element足够大吗?您也记得无效的终结者, right ?
如果在ArrayElement数据中定义了类似于此char *data;
的定义,并且稍后将与Malloc分配,那么您是否 nure nure index1具有足够大的缓冲区,足以在Index2中的数据,而VICE VICE ANDA?同样,您也记得零终结者, right ?