【问题标题】:Segmentation fault (core dumped) C++ error分段错误(核心转储)C++ 错误
【发布时间】:2013-07-02 03:19:52
【问题描述】:

我收到以下代码的“分段错误(核心转储)”错误:

#include <iostream>
#include <cstring>

template <class T>
T maxn(T* elements, int n);

template <> const char* maxn <const char*>(const char* elements[], int num);

int main(){
    using namespace std;

    //Using template
    int num[6] = {2, 3, 4, 5, 6, 22};
    double num2[4] = {16.6, 10.5, 2.3, 1.1};

    int larg = maxn(num, 6);
    double larg2 = maxn(num2, 4);
    cout << larg << endl << larg2 << endl;

    //Using specialization
    const char* pps[5] = {"Hello", "There", "I", "am", "me"};
    const char* largest = maxn(pps, 5);
    cout << largest << endl; 
    return 0;


}    

//return largest element in an array of T of n elements
template <class T>
T maxn(T* elements, int n){
    T largest = 0;
    for (int i=0; i<n; i++)
        largest = elements[i] > largest ? elements[i] : largest;
    return largest;
}    

//Returns address that points to the largest string
template <> const char* maxn <const char*>(const char* elements[], int num){
    int longest = 0;
    int i =0;
    for (i=0; i<num; i++)
        if (strlen(elements[i]) > strlen(elements[longest]))
            longest = i;
    return elements[i];
} 

我收到“警告:不推荐使用从字符串常量到 'char* 的转换”错误,但后来我将一些 char* 数组和函数参数更改为 const char*我摆脱了它。现在代码编译,我得到以下输出:

22

16.6

分段错误(核心转储)

前两行是对的,但我不明白第三行发生了什么。 请帮忙,谢谢。

【问题讨论】:

  • 如果你使用std::string而不是C风格的字符串,你会省去很多麻烦。
  • 请记住,您的 maxn 函数已经为您编写为 std::max_element
  • 再次选择 StackOverflow 而非 gdb。为什么人们不会学习使用 gdb?
  • @paddy,因为 gdb 没有“提问”按钮 :)
  • 这是 C++ Primer Plus 中的一个练习……我需要使用 C 风格的字符串并创建自己的函数,而不是使用内置函数。顺便说一句,我从未听说过 gdb。

标签: c++


【解决方案1】:

你返回元素越界:

return elements[i];

应该是:

return elements[longest];

我可以建议在 for 循环中声明 i

for (int i=0; i<num; i++)
//   ^^^^^^^

那么return elements[i];行会抛出编译时错误。

当然,您应该优先考虑内置函数和容器 :)

【讨论】:

  • 是的!我才意识到谢谢!
  • @LucasMezaliram 很高兴它有帮助:)
猜你喜欢
  • 2021-10-19
  • 1970-01-01
  • 1970-01-01
  • 2022-01-14
  • 2017-02-25
  • 2016-07-12
  • 2018-03-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多