2011-09-08 28 views
0

當我的函數從字符串中讀取浮點數並將它們放入void數組中時,出現分段錯誤。將字符串中的浮點數放到void數組中

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

因爲該串中的大小和數據的類型是在運行時確定的空隙陣列是必要的:在段錯誤後約200次迭代的在下面的代碼環路發生。我試過增加malloc大小,但它不會改變任何東西。有什麼想法嗎?

+0

malloc返回void *,爲什麼要投它? –

+0

除了'std :: cout' - 這不是** C++ ** – Nim

+0

爲什麼使用二維指針? –

回答

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; 
} 
+0

我需要使用void指針,因爲直到運行時才知道數據類型是什麼,並且無論它是何種類型,都必須將數據存儲在通用結構中。 – user934904

+0

user934904比看@Rob的答案 – Dewfy

0

我想,既然你要定義空指針的指針和分配/它鑄造void指針的指針,它分配4個字節的存儲器對於每個元素,因爲在C/C++中,指針類型的指針,指針始終是4個字節,它們不夠大。

+0

我認爲浮點數是4個字節,雙精度是8個字節。 – Kevin

+0

你說得對。我犯了一個錯誤。很長一段時間沒有用C編寫。 –

0

你把你的類型混淆在你編造「C++」的幌子下,你莫名其妙地嘗試創建這個怪物。無論如何。什麼你mallocing不過是float*,所以你需要投datafloat*

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

是有幾個問題。一個是 - data應該是void *,你有多餘的*。其他可能是對齊,我不確定你能夠在內存中的任何位置放置一個浮點。

5

認真??

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

現在,這是C++

+0

雖然這顯然是一個更好的解決方案,但它並沒有解釋seg故障在哪裏或爲什麼出現在op代碼中。 – Kevin

+0

@Kevin,如果OP發現答案不可接受,那是他的選擇 - 我更願意解決潛在的問題(方法),而不是這裏的具體問題(這是一種非常真實的方法副作用) – Nim

+0

我希望我可以做到這一點,但正如我所說,我不知道字符串內容或大小的數據類型,直到運行時。儘管如此,我仍然需要將數據保存在一個通用結構中,所以我被void指針卡住了。 – user934904

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

附:羅布的規則#47:當你​​的意思是'\n'時,千萬不要說std::endl

+0

我喜歡你的最後幾行,但我認爲這是一個有點雄心勃勃的目前執行的OP ...;) – Nim

+0

它必須是一個無效的**,因爲我在一個函數中分配內存並釋放它在別處。如果向量是可能的,我一定會使用它們。 – user934904

+0

@user,根據你的使用情況,你真的想'void *',而不是'void **'。如果你有一個專門用於指向void的指針而不是指向void的請求,請將其添加到問題中。 –

相關問題