带有 strlen 的 SEGEGV 用于长字符串
SEGEGV with strlen for long string
我正在尝试计算一个长字符串的长度,但是 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 运行而没有任何段错误。
当您从函数中 return 时,对象 str1
被销毁,因此 c_str
中的 return 似乎无法得到保证。您需要为此分配一个新字符串,例如:
c = strdup(str1.c_str()); // nb call free on the memory when done
您需要致电 free when you're done with the string returned from strdup。
编辑
This reference to c_str 也表示对原始字符串对象的任何字符串操作都会使 return 编辑的 c_str 无效。破坏对象(在你的情况下通过 returning)绝对符合操纵!
我正在尝试计算一个长字符串的长度,但是 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 运行而没有任何段错误。
当您从函数中 return 时,对象 str1
被销毁,因此 c_str
中的 return 似乎无法得到保证。您需要为此分配一个新字符串,例如:
c = strdup(str1.c_str()); // nb call free on the memory when done
您需要致电 free when you're done with the string returned from strdup。
编辑
This reference to c_str 也表示对原始字符串对象的任何字符串操作都会使 return 编辑的 c_str 无效。破坏对象(在你的情况下通过 returning)绝对符合操纵!