函数结束时的C ++ Seg Fault。参考线=闭合支撑

时间:2012-10-25 20:41:10

标签: c++ arrays segmentation-fault curly-braces strcpy

总结:非常感谢大家!下面发布的所有回复都是正确的。最初的错误是我忘记为NULL终止符留出空间。 Strcpy()是一个危险的函数,因为当我使用它时,它不知道'string'的结尾是什么时候。因此,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尝试调试它,一切正常,直到它击中大括号。

如果需要,我可以从程序中提供更多代码。我不想发布整个内容,因为这是一个类。

3 个答案:

答案 0 :(得分:4)

我最好的猜测是,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

答案 1 :(得分:2)

strcpy是危险的功能。如果输入字符串的长度为SIZE_OF_ELEMENT或更长,则将写入temp数组的末尾。如果必须使用固定大小的数组作为strcpy中的输出数组,则应在使用该函数之前测试strcpy是否有效。

更好的方法是从使用char数组切换到std::string

答案 2 :(得分:0)

数据是否定义为此char data[SOME_CONSTANT]?如果是这样,那么你确定SIZE_OF_ELEMENT足够大吗?你也在记住NULL终结符,正确

如果在ArrayElement数据中定义了这个char *data;并且以后分配了malloc,那么你是否确定 index1有一个足够大的缓冲区用于index2中的数据反之亦然?同样,你也记得了NULL终结符,正确