【问题标题】:Random string generator segmentation fault随机字符串生成器分段错误
【发布时间】:2016-01-03 12:36:51
【问题描述】:

我有一个练习,我制作了一个生成随机字符串的函数!当我在 Windows 中运行该程序时,它运行良好,但是当我尝试在 linux 中运行相同的程序时,我遇到了分段错误。我在linux中做了一个调试 我去这个:

** 程序收到信号 SIGSEGV,分段错误。 0x08048be5 in get_unique_name() () **

get_unique_name()的代码

/*Function that generates random strings*/
string get_unique_name( ) 
{
  char* s ;          
  for (int i = 0; i < 3 ; ++i) 
  {
     int randomChar = rand()%(26+26+10);
     if (randomChar < 26)
         s[i] = 'a' + randomChar;
     else if (randomChar < 26+26)
         s[i] = 'A' + randomChar - 26;
     else
         s[i] = '0' + randomChar - 26 - 26;
}
 s[3] = 0;
 return s ;
}

【问题讨论】:

标签: c++ linux string debugging segmentation-fault


【解决方案1】:

你没有初始化s指针。

使用数组可以解决您的问题:

 char s[4];

【讨论】:

    【解决方案2】:
    char* s;
    

    是未初始化的指针。取消引用它是未定义的行为。函数的返回类型是(std::)string,所以s也应该是std::string

    std::string s(3, ' '); // ' ' is a dummy character
    // you could also do
    std::string s;
    s.resize(3);
    

    并且s[3] = 0; 将不再需要(需要删除)。

    【讨论】:

      【解决方案3】:

      s 是一个指针,它需要指向内存中的某个位置。然后,您可以在此内存位置存储一些数据(位)。仅定义 (char *s) 指针本身不会分配指针指向的内存,您需要显式地使指针指向必须首先动态分配的内存位置(malloc/calloc/new 等)或静态例如。 s[10] 就像其他人建议的那样。

      现在您可能会问,为什么它可以在 Windows 上运行? 我会说,纯粹是靠运气......

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-05-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-08-01
        相关资源
        最近更新 更多