gpt4 book ai didi

c++ - valgrind : invalid read of size 1 during strcpy

转载 作者:行者123 更新时间:2023-11-27 23:14:57 24 4
gpt4 key购买 nike

当我启动 valgrind 时,一切正常,但从这个错误开始,后面的行开始表现相同(无效读取等)。

Invalid read of size 1
==5134== at 0x4C2BFE7: strcpy (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==5134== by 0x40C553: XAMBO::listing_start(std::string&) (listing.cpp:616)
==5134== by 0x40DAD7: msg_callback(unsigned char*) (msg_callback_act.cpp:263)

其中listing.cpp的函数如下(该函数接受一个字符串并去掉逗号,并将结果放入一个数组中。我从数组中随机选择结果,并将其放入一个字符串中并返回1字符串结果)

listing_start(string& _string){

string pick, tkn;
size_t pos = 0;
string delimiter = ",";
const char *service[MAX_SERVICE];

int i= 0,random_val= 0;

std::string::iterator e = std::remove(_string.begin(),_string.end(), ' ');
_string.erase(e, _string.end());

while ((pos = _string.find(delimiter))!= std::string::npos) {
tkn = _string.substr(0, pos);
if (!tkn.empty()) service[i] = tkn.c_str();
i++;
_string.erase(0, pos + delimiter.length());
}
service[i] = _string.c_str();
random_val = rand()%i;
strcpy((char*)pick.c_str(), service[random_service]);
return pick;

valgrind 指向的行是这样的:strcpy((char*)wanted_service.c_str(), service[random_service]);

我不明白为什么上面一行中的 stringcopy 不能正常工作(尽管当我打印结果时,我得到了我想要的)。为什么 valgrind 会报错,我应该如何修复上面的代码?

最佳答案

strcpy((char*)pick.c_str(), service[random_service]);

这是不正确的。 pick 是空字符串,不应通过 c_str 修改字符串内容。你应该使用

pick = service[random_service];

在这种情况下。

if (!tkn.empty()) service[i] = tkn.c_str();

这是不正确的。 service[i] 中的下一个 tkn = _string.substr(0, pos); 之后将是下一个 tkn.c_str()(以防万一,如果没有内存重新分配,否则你有悬空指针)。

关于c++ - valgrind : invalid read of size 1 during strcpy,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16958974/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com