0

私はCで書かれた次のコードを持っています:

unsigned char * pan_protocol_get_image(unsigned long *psize)
{
    long fsize;
    unsigned char *result;

    (void)pan_socket_write_ulong(MSG_GET_IMAGE);
    pan_protocol_expect(MSG_IMAGE);

    /* Read the size of the data in the message */
    (void)pan_read_long(&fsize);
    if (psize) *psize = fsize;

    /*
     * Allocate a buffer large enough for the result. We add one
     * in case the size is zero because we need a valid pointer.
     */
    result = (unsigned char *)malloc(fsize + 1);

    /* Read the data directly into the result buffer */
    (void)pan_read((void *)result, fsize);
    return result;
}

私の知る限り、上記の関数は (文字の配列ではなく) 文字へのポインタを返します。私は正しいですか?

その場合、関数の結果 (つまり、文字へのポインター) を文字の配列に変換して、それらを 1 つずつ読み取れるようにするにはどうすればよいでしょうか?

4

3 に答える 3

2

C では、配列は同じ型の要素のシーケンスです。文字列は単なる配列であり、単なる一連の文字です。

配列 (および文字列) は、最初の要素 (文字) へのポインターという1 つの方法でのみ表現されます。結論として、そうです、最初の要素へのポインターを取得するだけでは、配列または文字列の長さを知る方法はありません。このため、すべての C 文字列に'\0'は、文字列の終わりを検出するために、すべてゼロのバイトであるヌル文字が追加されます。配列の場合は、長さを渡す必要があります (ここではスキップするいくつかの特別な問題を除きます)。

あなたのプログラムでは、malloc()関数はバイトを割り当てfsize+1、最初のバイトへのポインタを返します。pan_protocol_get_image()

C プログラマーは、関数から返されたポインターが文字列の最初の文字を指していること、および文字列に null ターミネーターが含まれていることを確認する必要があります。

戻り値を通常の文字列として使用するだけで問題ありません。また、この関数によって返されるバッファ (文字列) の長さがわからないことに注意してください。

于 2013-07-18T11:10:14.353 に答える
1

戻り値の型を変更する必要はありません。malloc()インデックスを使用して、割り当てられたメモリ領域を直接逆参照できます。配列のベースアドレスを返しています。したがって、そのアドレスにインデックスを追加することで、割り当てられたメモリに直接アクセスできます。こんな感じでアクセスできます。

result[0],result[1],....
于 2013-07-18T11:09:45.370 に答える