我正在尝试计算长字符串的长度,但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运行,没有任何段错误。
答案 0 :(得分:1)
当您从函数返回时,对象str1
将被销毁,因此c_str
的返回似乎不会得到保证。您需要为此分配一个新字符串,例如:
c = strdup(str1.c_str()); // nb call free on the memory when done
修改强>
This reference to c_str还表示对原始字符串对象的任何字符串操作都将使返回的c_str无效。销毁对象(在你的情况下返回)绝对有资格作为操纵!