【问题标题】:Placing floats from string into void array将浮点数从字符串放入 void 数组
【发布时间】:2011-11-13 00:39:12
【问题描述】:

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

【问题讨论】:

  • malloc 返回 void*,为什么要强制转换它?
  • 除了std::cout - 这不是c++
  • 为什么要使用二维指针?
  • 段错误在哪一行?
  • 1. There is no such thing 作为“空数组”。 2. C和C++不是同一种语言;你需要选择一个。 3. 呃,strtok.

标签: c++ arrays malloc


【解决方案1】:

说真的??

std::vector<float> data;
std::istringstream str(text);
float fv;
while (str >> fv)
{
  data.push_back(fv);
}

现在是 c++

【讨论】:

  • 虽然这显然是一个更好的解决方案,但它并没有解释 seg 错误在哪里或为什么它出现在操作代码中。
  • @Kevin,如果 OP 认为答案不可接受,这是他的选择 - 我更喜欢解决潜在问题(方法)而不是这里的具体问题(这是一个非常真实的副作用方法)
  • 我希望我能做到这一点,但正如我所说,直到运行时我才知道字符串内容的数据类型或大小。不过,我需要将数据保存在一个通用结构中,所以我被 void 指针困住了。
【解决方案2】:

尽管这样做让我很痛苦,但这里有一个版本的代码可能可以满足你的需求。

// 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));

附: Rob 的规则 #47:当你​​的意思是 '\n' 时,永远不要说 std::endl

【讨论】:

  • 我喜欢你的最后几行,但考虑到当前的实现,我认为这对 OP 来说有点雄心勃勃...... ;)
  • 它必须是一个空**,因为我在一个函数中分配内存并在其他地方释放它。如果向量是可能的,我肯定会使用它们。
  • @user,从你的用法来看,你真的想要void*,而不是void**。如果您有专门针对指向空指针而不是空指针的要求,请将其添加到问题中。
【解决方案3】:

你为什么要转换成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;
}

【讨论】:

  • 我需要使用void指针,因为直到运行时我才知道数据类型是什么,并且无论是什么类型我都必须将数据存储在一个通用的结构中。跨度>
  • user934904 比查看@Rob 的答案
【解决方案4】:

在编写“C++”的幌子下莫名其妙地尝试创建这个怪物时,你把你的类型弄混了。反正。您要分配的只是float*,因此您需要将data 转换回float*

((float*)data)[0] = myfloat;

【讨论】:

    【解决方案5】:

    我认为,由于您正在定义 void 指针的指针并将其分配/转换为 void 指针的指针,因此它为每个元素分配 4 字节内存,因为在 C/C++ 中,无论指针的类型如何,指针都是总是 4 字节不够大的浮点数。

    【讨论】:

    • 我认为浮点数是 4 个字节,双精度数是 8 个字节。
    • 你是对的。我犯了一个错误。很久没有用C写了。
    【解决方案6】:

    有几个问题。一种是-data 应该是void *,你有多余的*。其他可能是对齐,我不确定您是否能够在内存中的任何位置放置一个浮点数。

    【讨论】:

      猜你喜欢
      • 2014-02-08
      • 2011-07-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多