0

学校のプロジェクトで itoa() をいじっていて、問題なく動作していましたが、エラーが発生し始めました。itoa の最初のインスタンスが処理されたときに、セグメンテーション エラーが発生しました。

これが問題のコードです。

なぜそれが最初に機能し、その後問題が発生するのかわかりません。ブレークダウン前に追加したのは、コードから既にコメントアウトしているため、含めなかった一番下の 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.
4

2 に答える 2

4

この関数itoaは、既に割り当てられたバッファーを想定しています。試す:

char* sValue = malloc(20);

sFreqたまたまそのまま「動作」したとしても、同じことが言えます。

于 2013-02-24T22:00:36.770 に答える
1

はポインター引数を取るようにitoa()定義されていますが、そのポインターは、結果を受け入れるのに十分な大きさのメモリ ブロックを指している必要があります。あなたの場合、ポインタはユニット化されています。

最も簡単な解決策は、適切なサイズの配列を宣言することです。配列は、ポインター引数を受け取る関数に渡すことができます。それらは参照によって渡されるため、関数は配列のコピーではなく、配列へのポインターを受け取ります。

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

配列のサイズは、潜在的な符号プレフィックスを持つ 64 ビット整数を受け入れるのに十分です。32ビットの場合は12個しか必要ありませんが、コードが何のためにコンパイルされるかを知る必要がないことを確認することもできます.

itoa に代わるものは、次を使用することsprintfです。

sprintf( sValue, "%u", i ) ;
于 2013-02-24T22:47:49.570 に答える