C++ C++;功能结束时出现Seg故障。参考线=闭合支撑

C++ C++;功能结束时出现Seg故障。参考线=闭合支撑,c++,arrays,segmentation-fault,curly-braces,strcpy,C++,Arrays,Segmentation Fault,Curly Braces,Strcpy,最后:非常感谢大家!下面所有的回复都是正确的。最初的错误是我忘记给空终止符留出空间。Strcpy()是一个危险的函数,因为当我使用它时,它不知道“string”的结尾是什么时候。因此,strcpy()抓取了大量数据并重写了返回地址 编辑:从程序中添加更多代码 解决:老实说,我最初的实现是垃圾。我甚至不知道,如果我想交换数组中的元素,为什么要这样写swap。(当时,每个元素中只有一个字符数组,所以我可以不用使用旧的实现)。我已重新写信给: void swap(ArrayElement list[]

最后:非常感谢大家!下面所有的回复都是正确的。最初的错误是我忘记给空终止符留出空间。Strcpy()是一个危险的函数,因为当我使用它时,它不知道“string”的结尾是什么时候。因此,strcpy()抓取了大量数据并重写了返回地址

编辑:从程序中添加更多代码

解决:老实说,我最初的实现是垃圾。我甚至不知道,如果我想交换数组中的元素,为什么要这样写swap。(当时,每个元素中只有一个字符数组,所以我可以不用使用旧的实现)。我已重新写信给:

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尝试并调试它,直到它碰到大括号为止,一切都正常工作


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

我的最佳猜测是,
列表[index2]中的字符串。数据
大于
temp[]
,通过复制,可以重写堆栈和返回地址

尝试插入长度的测试:

#include <iostream>

...
int n = strlen(list[index2].data);
std::cerr << "len=" << n << ", SIZE_OF_ELEMENT=" << SIZE_OF_ELEMENT << std::endl;
#包括
...
int n=strlen(列表[index2]。数据);

std::cerr我的最佳猜测是,
列表[index2].data
处的字符串大于
temp[]
,通过复制,可以重写堆栈和返回地址

尝试插入长度的测试:

#include <iostream>

...
int n = strlen(list[index2].data);
std::cerr << "len=" << n << ", SIZE_OF_ELEMENT=" << SIZE_OF_ELEMENT << std::endl;
#包括
...
int n=strlen(列表[index2]。数据);

std::cerr
strcpy
是一种危险功能。如果输入字符串的长度为
SIZE\u of_ELEMENT
或更大,您将写入
temp
数组的末尾。如果必须在
strcpy
中使用固定大小的数组作为输出数组,则应在使用该函数之前测试
strcpy
是否正常工作

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);
}

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

strcpy
是一种危险的功能。如果输入字符串的长度为
SIZE\u of_ELEMENT
或更大,您将写入
temp
数组的末尾。如果必须在
strcpy
中使用固定大小的数组作为输出数组,则应在使用该函数之前测试
strcpy
是否正常工作

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);
}

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

数据是这样定义的
char数据[某些常量]
?如果是这样,那么您确定元素的大小足够大吗?你也记得空终止符,对吗


如果数组中的元素数据定义如下
char*data并在稍后使用malloc进行分配,那么您是否确定index1有足够大的缓冲区用于index2中的数据,反之亦然?同样,您还记得空终止符,对吗?

数据是这样定义的
字符数据[某些常量]
?如果是这样,那么您确定元素的大小足够大吗?你也记得空终止符,对吗


如果数组中的元素数据定义如下
char*data并在稍后使用malloc进行分配,那么您是否确定index1有足够大的缓冲区用于index2中的数据,反之亦然?同样,您也记住了空终止符,对吗?

std::swap(list[index2].data,list[index1].data)
这对您有用吗,出于好奇。您应该至少显示调用函数的上下文以及
ArrayElement
是什么…您是否尝试过调试器?@JimBalter-仅当
.data
是数组时。如果是
char*
,你的建议就有问题了。@Robᵩ 是的。。。我匆匆写了一封信。
std::swap(list[index2].data,list[index1].data)
出于好奇,这对你有用吗。你应该至少显示一下调用函数的上下文以及
ArrayElement
是什么……你试过你的调试器吗?@JimBalter-只有
.data
是数组时才可以。如果是
char*
,你的建议就有问题了。@Robᵩ 是的。。。我匆匆写了封信,你是对的。我得到len=240,元素的大小=30。我不知道这会是什么样子。(我在原来的帖子中添加了更多代码)。在使用我自己的测试数据之前,这个实现已经工作了。当我使用讲师提供的文件时,这个错误开始出现。我将重写swap,使temp成为ArrayElement对象,并使用“=”进行交换。。。让我们看看它是否有效:)谢谢你帮我解决我的问题。如果你想读一个错误的结论,我把它添加到了原始帖子的顶部。你是对的。我得到len=240,元素的大小=30。我不知道这会是什么样子。(我在原来的帖子中添加了更多代码)。在使用我自己的测试数据之前,这个实现已经工作了。当我使用讲师提供的文件时,这个错误开始出现。我将重写swap,使temp成为ArrayElement对象,并使用“=”进行交换。。。让我们看看它是否有效:)谢谢你帮我解决我的问题。如果你想阅读错误的结论,我将其添加到原始帖子的顶部。谢谢你帮助我解决我的问题。如果你想阅读错误的结论,我将其添加到原始帖子的顶部。谢谢你帮助我解决我的问题。如果你想读一个错误的结论,我把它添加到了原始文章的顶部。我确实忘记了空终止符。这是最初的错误。谢谢你帮我解决问题。如果你想读一个错误的结论,我把它添加到了原始文章的顶部。我确实忘记了空终止符。这是最初的错误。谢谢你帮我解决问题。如果你想读一个结论