0
struct s_client *cur_client(void){
    return (struct s_client *) pthread_getspecific(getclient);
}



int32_t chk_process (int32_t) {
...
struct s_client *ptr = cur_client();

//FIXME
// how could i check in this line , just when the value of 
// ptr is not zero , then it goes to it's next line?`

send_data (ptr, index);
...
...
}

ptrの値がゼロでない場合にのみ確認したいのですが、次の行に移動します。このコード行を試しました。

if (*ptr != 0)

しかし、予想どおり、値がチェックされていないため、これは正しくありませんでした。

Edit2:ええと、ptrがpthread_getspecificからいっぱいになったので、私は自分自身に理由を見つけました。スレッド固有のデータが破棄されているキーでpthread_getspecificが呼び出された場合、値NULLが返されます。詳細については、マニュアルページを確認してください...ストーリーの終わり

Edit1:

これは、上記のコードで使用されている構造体名cur_client()です。

4

3 に答える 3

2

おそらく、ポインタがnullでないかどうかをテストしたかったでしょう。その場合、比較を行うときに間接参照しないでください。

if (ptr != 0) 

または:

if (ptr != NULL) 
于 2012-09-14T12:56:46.960 に答える
1

ptrstruct s_clientはへのポインタ*ptrですが、はstruct s_clientそれ自体です。

ポインタを0と比較しているのではなく、構造を0と比較しようとしていますが、これは実行できません。

于 2012-09-14T12:56:36.713 に答える
0

ポインターが指す構造体にゼロのみが含まれているかどうかを確認したいようです。次のように実行できます。

int i, isNonzero = 0;
for (i = 0; i < sizeof(*ptr); i++) {
    if (((char *)ptr)[i] != 0) {
        isNonzero = 1;
        break;
    }
}
if (isNonzero) {
    /* etc. */
}

編集: いいえ、ptr はポインターのアドレスではなく、ポインター自体です。それを確認したい場合は、NULL と比較してください。ポインターは、メモリアドレスを表す整数を保持する単なる通常の変数そのものです。ポインター型の変数 (これは ptr です) にはアドレス自体があり、!= 演算子を使用すると比較されると思われるようです。いいえ、そうではありません - あなたは書く必要があります

if (&ptr != NULL) {
}

それをするために。心配しないでください、他の回答の提案も良いです。

そして、C ポインターに関するチュートリアルを読む努力をしてください。これは、StackOverflow で質問するにはあまりにも基本的なことです。

于 2012-09-14T13:17:51.350 に答える