将浮点数从字符串放入void数组

时间:2011-09-08 13:47:16

标签: c++ arrays malloc

当我的函数从字符串中读取浮点数并将它们放在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的大小,但它并没有改变任何东西。有什么想法吗?

6 个答案:

答案 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 *,您有多余*。其他可能是对齐,我不确定你是否能够在内存中的任何位置放置一个浮点数。