当我的函数从字符串中读取浮点数并将它们放在void数组中时,我遇到了分段错误。在以下代码中的for循环的大约200次迭代之后发生段错误:
// Allocate memory
void** data;
data = (void**)malloc(num_vals * sizeof(float));
// Convert text to floats
(*(float**)data)[0] = atof(strtok(text, " "));
for(int index=1; index<num_vals; index++) {
(*(float**)data)[index] = atof(strtok(NULL, " "));
std::cout << (*(float**)data)[index] << std::endl;
}
void数组是必需的,因为字符串中数据的大小和类型是在运行时确定的。我尝试过增加malloc的大小,但它并没有改变任何东西。有什么想法吗?
答案 0 :(得分:5)
严重??
std::vector<float> data;
std::istringstream str(text);
float fv;
while (str >> fv)
{
data.push_back(fv);
}
现在是c ++
答案 1 :(得分:1)
为什么要转换为void **
???您的代码包含索引时的几个错误,所以让我展示一些合理的更改
float* data;
data = (float*)malloc(num_vals * sizeof(float));
// Convert text to floats
data[0] = atof(strtok(text, " "));
for(int index=1; index<num_vals; index++) {
data[index] = atof(strtok(NULL, " "));
std::cout << data[index] << std::endl;
}
答案 2 :(得分:1)
尽管我这样做很痛苦,但这里有一个代码版本可能会做你想要的。
// Allocate memory
void* data;
data = malloc(num_vals * sizeof(float));
// Convert text to floats
((float*)data)[0] = atof(strtok(text, " "));
for(int index=1; index<num_vals; index++) {
((float*)data)[index] = atof(strtok(NULL, " "));
std::cout << ((float*)data)[index] << '\n';
}
但请注意,如果您为我工作并尝试检查该代码,我们将对您选择的职业进行认真的讨论。
我宁愿看到这样的事情:
std::vector<float> v;
std::copy(std::istream_iterator<float>(std::istringstream(text)),
std::istream_iterator<float>(),
std::back_inserter(v));
P.S。 Rob的规则#47:当你的意思是std::endl
时,永远不要说'\n'
。
答案 3 :(得分:0)
我认为,既然你正在定义一个void指针的指针并将它分配/转换为void指针的指针,它会为每个元素分配4字节的内存,因为在C / C ++中,指针的类型,指针是总是4个字节,浮动不够大。
答案 4 :(得分:0)
在你写出“C ++”的幌子下,你的莫名其妙的尝试让你的类型混乱了。无论如何。你正在进行商业化的只是一个float*
,所以你需要将data
投回到float*
:
((float*)data)[0] = myfloat;
答案 5 :(得分:0)
有几个问题。一个是 - data
应为void *
,您有多余*
。其他可能是对齐,我不确定你是否能够在内存中的任何位置放置一个浮点数。