1
client_t *client_create_no_window(char *in, char *out); 

// ...

char line[50];
while((c = getchar()) != EOF && c != '\n')
{
    line[pos] = c;
    pos++;
}
pos=0;

client_create_no_window次に、最初に実行して関数を呼び出そうとします

char* first = (char*) line[1];
char* second= (char*) line[2];
client_create_no_window(first, second);

異なるサイズの整数からポインタへのエラーキャストが発生し続けます。私はこれらに関する以前の投稿のいくつかを見てきましたが、なぜこれが起こっているのかまだ理解できません

4

4 に答える 4

2

これ:

char*first = (char*) lines[1];

文字lines[1]取得し、強制キャストによってchar *(文字へのポインタ、つまりアドレス) に変換し、文字ポインタに格納しますfirst

文字はアドレスではないため、この割り当てには意味がありません。

必要なのは、おそらくその文字のアドレスです。これは、「アドレス」演算子を使用して取得できます&

char *first = &lines[1];

これは、ポインター演算を使用して次のように書くこともできます。

char *first = lines + 1;

ただし、C では 0 からインデックスが付けられるため、最初の文字は実際には にあることに注意してくださいlines[0]

char *first = &lines[0];

2番目は次のlines[1]とおりです。

char *second = &lines[1];
于 2013-02-22T14:36:18.060 に答える
2
char line[50];

文字の配列を定義します。2 番目の文字 ( ) は、 "address of"演算子 ( )line[1]を使用して取得できるアドレスのメモリに格納されます。&&line[1]

char* second = (char*) line [1];

は 2 番目の文字 ( line[1]) を取り、それを へのポインターにキャストしますがchar、これは正しくありません。2 番目の文字へのポインターは、この文字が存在するアドレスを使用して初期化する必要があります。

char* second = &line[1];
于 2013-02-22T14:33:20.883 に答える
1

まず、単なるタイプミスだと思いますが、char lines[]代わりにchar line[]. 次に、 のアドレスを に入れline[0]ますfirstか? それは次のようになります。

char *first = line;

または

char *first = &line[0];

同様に:

char *second = &line[1];

最初と 2 番目の文字がそれぞれインデックス 0 と 1 にあることに注意してください。

于 2013-02-22T14:36:46.907 に答える
0

次のようにコードを変更します (実際にポインタを line[1] と line[2] の値に割り当てようとしていると仮定します)。行 [1] と行 [2] のアドレスを指定する場合は、上記のように &line[] を実行すると、サイズに関する警告メッセージを停止するために reinterpret_cast を使用する必要がなくなります。

line[1] = 2;
line[2] = 0x234234;

char* first = reinterpret_cast<char *>(line[1]);
char* second= reinterpret_cast<char *>(line[2]);
client_create_no_window(first, second);

1 つ目は 0x000002 を指し、2 つ目は 0x234234 を指します。

reinterpret_cast は値を受け取り、指定されたポインタの型とサイズにキャストします。古いコンパイラでは char *ptr = (char *)23 を実行するだけで十分でしたが、新しいコンパイラは int (23 は int に格納される) がポインターのサイズ (通常は 64 ビット) ではないことを認識しており、警告メッセージ。reinterpret_cast はそれを修正します。

于 2016-04-15T18:11:30.533 に答える