3

メモリアドレスを取得して、変数に格納されている特定の量だけ進める方法はありますか? そして、その変数の型は何である必要がありますか?

たとえば、次のコードでは、最初に data + 0 を確認し、その後の各ステップで data + sent を確認します。これを正しく見れば、sent はバイトとして格納され、data はメモリ アドレスです。

bool sendAll(int socket, const void *data, ssize_t size) {
    ssize_t sent = 0;
    ssize_t just_sent;
    while (sent < size) {
        just_sent = send(socket, data + sent, size - sent, 0);
        if (just_sent < 0) {
            return false;
        }
        sent += just_sent;
    }
    return true;
}
4

2 に答える 2

3

それが何char*をするかです。ポインタの型が。の場合、ポインタの計算はT*常に。の増分で機能しますsizeof (T)。そしてsizeof (char) == 1定義上。

だから試してみてください:

just_sent = send(socket, sent + (const char*)data, size - sent, 0);
于 2012-10-30T04:39:48.143 に答える
2

「送信を呼び出す1行を私の回答のバージョンに置き換えるだけです」と思うので、@Benの回答を補完するだけです。あまり良い答えではありません...

@Rick、重要なのは、転送されたバイト数を知っていることです。配列が整数の配列であるかどうかに関係なく、にキャストできる - 番目のバイトから開始したい場合は、コンパイラsentバイトを追加する際に正しいポインター演算を行います。それは、バイトだからです。代わりに にキャストすると、バイトをシフトする代わりに、バイトをシフトします。data(char*)(char*)data + sentsentdatasizeof(char) == 1data(int*)sentsent * sizeof(int)

于 2012-10-30T04:56:33.860 に答える