0

私はかなり長い間Cを作成しておらず、MySQL C APIを使用してアプリを作成しており、redhatでg++でコンパイルしています。

だから私はprintfsでいくつかのフィールドを出力し始めます...私が使用していたPRO*Cで(何年も前にsuseで)oracle apiを使用して、intを選択して次のように出力できます:

int some_int;
printf( "%i"、some_int);

mysql intsでそれを実行しようとしましたが、8つの乱数が表示されました...これはmysql apiの問題であり、サーバーの構成の問題であると考え、修正しようとして数時間を無駄にしましたが、修正できませんでした。そして、私ができることがわかりました:

int some_int;
printf( "%s"、some_int);

整数を正しく出力します。抽出している値の計算を行っていないため、これは問題のない解決策だと思いました。

私がいくつかのものを数えようとするまで....

私は簡単なことをしました:

int行数;
for([stmt]){
行数++;
}
printf( "%i"、rowcount);

再び8桁の乱数を取得しています...このマシンのintとの取引が何であるかを理解できませんでした。

次に、intをゼロに初期化すると、適切な数値が得られることに気付きました。

誰かがint変数をゼロに初期化するために必要な条件を教えてもらえますか?古いコードベースで毎回これを行ったことを思い出せません。また、mysql_stmtコードをモデル化した例では見られませんでした...

私が欠けているものはありますか?また、これが毎回必要であることを忘れてしまった可能性もあります

ありがとう...

4

6 に答える 6

1

変数を初期化しない場合、デフォルトの 0/NULL/その他の値は保証されません。一部のコンパイラはそれを 0 に初期化する可能性があります (IIRC、MSVC++ 6.0 はそうするのに十分親切です)、他のコンパイラはそうしないかもしれません。だからそれに頼らないでください。最初にある種の適切な値を与えずに変数を使用しないでください。

于 2009-04-02T16:45:45.300 に答える
1

グローバル値と静的値のみがゼロに初期化されます。初期化されていない場合、スタック上の変数には常にガベージ値が含まれます。

int g_var; //This is a global varibale. So, initialized to zero
int main()
{

int s_var = 0; //This is on stack. So, you need to explicitly initialize
static int stat_var;  //This is a static variable,  So, initialized to zero
}
于 2009-04-02T16:48:32.577 に答える
1

常に変数を初期化する必要があります。この種のエラーをキャッチするには、おそらく でコンパイルし-Wallて、提供される可能性のあるすべての警告を表示する必要がありg++ます。-Werrorほとんどの場合、警告がエラーまたは潜在的なエラーを示しており、コードをそのままにしておくよりもコードをクリーンアップする方がよいため、すべての警告をエラーにするために を使用することも好みます。

また、2 番目の printf では、%s整数ではなく文字列を出力するために使用しました。

int i = 0;
printf("%d\n", i);
// or
printf("%i\n", i);

あなたが望むものです。

于 2009-04-02T16:56:24.447 に答える
0

変数は c で自動的に初期化されません。

于 2009-04-02T16:46:26.250 に答える
0

あなたは確かに忘れています。C および C++ では、自動初期化は行われません。cafterの内容は、その時点でint c;参照されているアドレスにcあるものです。

ベスト プラクティス: 定義で初期化: int c = 0;.

追伸、MySQL の int 型が C の int 型と一致するように注意してください。そうだと思いますが、私は肯定的ではありません。sizeof(int)ただし、すべての C 環境で同じではないため、アーキテクチャとコンパイラの両方に依存します。

于 2009-04-02T16:46:59.383 に答える
0

初期化されていない変数。

int some_int = 0;
于 2009-04-02T16:50:37.800 に答える