c++ - 带有 strlen 的 SEGEGV 用于长字符串

标签 c++ arrays string strlen

我正在尝试计算一个长字符串的长度,但是 strlen 函数对于以下代码示例无法给出 SEGFAULT。

#include <iostream>
#include <stdlib.h>
#include <cstring>

using namespace std;

const char * genstring( long len){
    string str,str1;
    char *c;
    int min=97, max = 122; 
    int output;

    for( long i=0; i<len; i++){

        output = min + (rand() % static_cast<int>(max - min ));
        str = (char)output;
        str1.append(str);

    }
    c = (char *)str1.c_str();

    return (const char*)c;

}

int main(){
    const char *s = genstring(100000);
    cout << strlen(s);

}

gdb报错如下

Program received signal SIGSEGV, Segmentation fault.
strlen () at ../sysdeps/x86_64/strlen.S:203
203 ../sysdeps/x86_64/strlen.S: No such file or directory.

但是对于 60k 的长度,同样的程序可以工作。同样的程序也使用 clang 运行而没有任何段错误。

最佳答案

当您从函数返回时,对象 str1 被销毁,因此似乎无法保证从 c_str 返回。您需要为此分配一个新字符串,例如:

c = strdup(str1.c_str()); // nb call free on the memory when done

您需要调用 free当您处理完从 strdup 返回的字符串时.

编辑
This reference to c_str确实还说对原始字符串对象的任何字符串操作都会使返回的 c_str 无效。销毁对象(通过在您的情况下返回)绝对符合操纵!

关于c++ - 带有 strlen 的 SEGEGV 用于长字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49761078/

相关文章:

c++ - 陷入无限递归

c - 逐行读取文本文件并保存到数组(C语言)

java - 为什么我的字符串初始化会抛出 NullPointerError?

java - 检查给定的字符串是否可以由给定的一组字符串组成

java - 将在常量池中创建多少个字符串对象

c++ - 将类分离到它们自己的定义和实现文件中,并将 main 放在它自己的文件中

c++ - 将变化的对象存储在 STL 集中是否安全?

python - 切片和椭圆索引操作会产生什么结果?

c++ - 在 OpenVM 上构建 Boost

javascript - Onclick window.location 并传递参数