2013-02-24 29 views
0

一直玩itoa()爲一個學校項目,它工作正常,然後開始拋出錯誤。 說itoa的第一個實例處理時,它有一個分段錯誤。itoa在C使用Codeblocks導致分段錯誤

這裏是違規的代碼。

我不明白爲什麼它會起初工作,然後開始有問題。我之前添加的唯一一件事是在底部添加了一些printf()行,因爲我已經將它們從代碼中註釋掉了,但它仍然不起作用。

#include <stdio.h> 
#include <stdlib.h> 

int main() 
{ 

//Variables 

unsigned int byteH=0b00011001; 
unsigned int byteL=0b00001110; 
char* sValue; 
char* sFreq; 
float iConv; 
char Output[4]; 
int i; 


i=((byteH*32)+byteL); // just adding two 5bit blocks together 

itoa(i,sValue,10);  // This instance throws the segmenation error 

iConv=((byteH*32)+byteL); 
iConv=(int)(iConv/1.023); 
i=(int)iConv; 

itoa(i,sFreq,10);  // This instance doesn't cause problems. 
+0

可能「工作」,然後不工作的原因是因爲指針未設置爲指向存儲。未初始化的值是「隨機的」。如在其中,不是真正的隨機,而是依賴於複雜的因素,這些因素不值得你花時間去弄清楚僞隨機數生成器。 – 2013-02-24 22:30:49

回答

4

函數itoa需要一個alreay分配緩衝區。請嘗試:

char* sValue = malloc(20); 

即使碰巧「工作」,它仍然是sFreq

+0

太棒了!謝謝,完全解決了這個問題。 – 2013-02-24 22:08:12

+1

@ChefFlambe一旦你完成了它,不要忘了'free(sValue)'。 – cnicutar 2013-02-24 22:08:38

+0

鑑於原始錯誤,您不認爲使用malloc/free可能只是邀請其他類型或錯誤。更明顯和更安全(實際上更高效)的解決方案將簡單地將sValue聲明爲數組:'char sValue [21]'。請注意,需要21個字符才能容納字符串,最大長度爲64位,並且帶有nul終止符。在32位平臺上,陣列只需要11個字符。 – Clifford 2013-02-24 22:31:43

1

雖然itoa()被定義爲採用指針參數,該指針必須指向一個足夠大的內存塊來接受結果。在你的情況下,指針是單位化的。

最簡單的解決方案是聲明適當大小的數組。數組可以傳遞給接受指針參數的函數 - 它們通過引用傳遞,所以函數接收一個指向數組的指針,而不是它的副本。

char sValue[22] ; 
char sFreq[22] ; 

該數組的大小足以接受具有潛在符號前綴的64位整數。 32位只需要12位,但你也可以確保你不必知道代碼將被編譯爲什麼。

到itoa另一種方法是使用sprintf

sprintf(sValue, "%u", i) ;