SEGEGV用strlen做长串

时间:2018-04-10 18:57:18

标签: c++ arrays string strlen

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

import requests
f = requests.get('https://api.storj.io/contacts/f52624d8ef76df81c40853c22f93735581071434')

# Store content as json
answer = f.json()

# List of element you want to keep
items = ['protocol', 'responseTime', 'reputation']

# Display
for item in items:
    print(item + ':' + str(answer[item]))

# If you want to save in a file
with open("Output.txt", "w") as text_file:
    for item in items:
        print(item + ':' + str(answer[item]), file=text_file)

gdb中的错误如下

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

}

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

1 个答案:

答案 0 :(得分:1)

当您从函数返回时,对象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无效。销毁对象(在你的情况下返回)绝对有资格作为操纵!