SEGEGV 带长弦的 strlen

SEGEGV with strlen for long string

本文关键字:strlen SEGEGV      更新时间:2023-10-16

我正在尝试计算长字符串的长度,但是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

当你完成从strdup返回的字符串时,你需要调用free。

编辑
对 c_str 的引用还表示,对原始字符串对象的任何字符串操作都将使返回的c_str无效。破坏物体(在您的情况下通过返回(绝对符合操纵的条件!