SEGEGV 带长弦的 strlen
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运行,没有任何段错误。
当您从函数返回时,对象str1
被销毁,因此从c_str
返回似乎无法保证。您需要为此分配一个新字符串,例如:
c = strdup(str1.c_str()); // nb call free on the memory when done
当你完成从strdup返回的字符串时,你需要调用free。
编辑
对 c_str 的引用还表示,对原始字符串对象的任何字符串操作都将使返回的c_str无效。破坏物体(在您的情况下通过返回(绝对符合操纵的条件!
相关文章:
- 循环中的条件:为什么每次都调用strlen(),而vector.size()只调用一次
- std::strlen 在内部是如何工作的?
- 为什么strlen(s)与s的大小不同,为什么cout-char显示的是字符而不是数字
- C++编译 strlen 和 strcpy 的问题
- c 字符串 c++ 中 strlen 的递归版本
- 为什么emplace_back("Hello")调用strlen?
- 当 NUL 字符被定义为字符串的一部分时,为什么 strlen() 不计算终止 NUL 字符的字节?
- 无法执行内部函数 strlen
- strlen 是否针对字符串文字进行了优化?
- CPP - strlen 不会输出多个单词的整个长度 [仅限 C 字符串]
- 字符指针的长度使用 strlen() 不正确
- 如何获取字符*的实际长度?strlen 和 sizeof(target)/sizeof(target*)之间的区别?
- SEGEGV 带长弦的 strlen
- 编译失败:strlen 不是 std 的成员
- 对Strcat和Strlen功能的深刻理解
- 如果 strlen 在 char 数组之间遇到空格,它会怎么做
- 如何修复strlen seg故障
- 恒定字符阵列的获取字符串长度函数(strlen)不是恒定表达式
- C++ strlen() 初始化的字符数组
- strlen 显示数组元素的数量错误