函数结束时的C SEG故障.参考线=闭合支架



结论:非常感谢大家!下面发布的所有答复都是正确的。最初的错误是我忘记了为空终结者留出空间。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

相关内容

  • 没有找到相关文章

最新更新