如何在动态char*缓冲区上使用strcpy
how to use strcpy on dynamic char * buffer
使用strcpy(SIGSEGV(QT Linux))分配动态缓冲区数据时遇到问题
char ** data = new char *[10];
int current = 0;
char temp[20];
std::cin >> temp;
strcpy( data[ current++ ], temp); //works(before edit)
//I saw SIGSEGV message only on dynamic input
//that's why I was thinking it works
char * dynamicTemp = new char [ 20 ];
std::cin >> dynamicTemp;
strcpy( data[ current++ ], dynamicTemp ); //SIGSEGV
我应该如何正确存储数据?这只是为了知识,所以不需要字符串示例。
您实际上没有为data[current]
中的指针分配内存,导致未定义的行为(UB的一个可能结果是,有时似乎运行良好)。
要么分配内存并将其分配给指针,要么使用std::string
(这是我的建议)。
在现代C++中,现在几乎没有理由使用指针,尤其是字符串。使用指针只会产生类似您所遇到的问题,甚至更多。使用std::string
也意味着,如果用户输入的字符串长度超过19个字符,就不会有缓冲区溢出的风险。
您已经分配了一个char指针数组。您需要为每个字符串分配内存,类似于以下内容:
char * dynamicTemp = new char [ 20 ];
std::cin >> dynamicTemp;
data[ current++ ] = new char [ 20 ];
strcpy( data[ current ], dynamicTemp );
您正在取消引用指向未分配内存的指针。
char ** data = new char *[10];
strcpy( data[ current++ ], temp); //works
data[ current++ ]
指向未分配的内存。
代码的另一个问题是不受控制的strcpy
和cin读取。您不能保证用户输入适合您的缓冲区。
相关文章:
- C++字符*缓冲区的大小
- 使用strcpy将char数组的元素复制到另一个数组
- 为什么msgrcv()将垃圾字符馈送到缓冲区
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- ostream过载时的缓冲区冲洗
- C++中的高效循环缓冲区,它将被传递给C样式数组函数参数
- Xaudio2在更改缓冲区或循环时弹出声音
- 为什么我在leetcode上收到AddressSanitizer:地址0x602000000058上的堆缓冲区溢出错误
- 如何将图像传输到c++(dll)中的缓冲区,然后在c#的缓冲区中读/写
- 如何在cpp.中使用协议缓冲区存储大缓冲区/数组(char/int)
- 多线程双缓冲区
- Android P-9.0.0_r53 Logcat主缓冲区超出定义大小
- 套接字读取后,我在缓冲区中看到意外输入
- std::带有自定义缓冲区的 iostream 不允许我写入
- 从返回的顶点缓冲区查询顶点结构
- Vulkan 中的动态顶点缓冲区格式设置
- OpenGL 16 位模板缓冲区?
- 在 leetcode 上提交解决方案时出现堆栈缓冲区溢出错误
- C++ strcpy 后缓冲区的错误
- 如何在动态char*缓冲区上使用strcpy