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;
}

据我了解,上面的函数返回一个指向字符(而不是字符数组)的指针。我对么?

如果是这种情况,如何将函数结果(即指向字符的指针)转换为字符数组,以便我可以一个一个地读取它们?

4

3 回答 3

2

在 C 中,数组只是相同类型的元素序列。字符串只是数组,只是一个字符序列。

数组(和字符串)仅以一种方式表示 -指向第一个元素(字符)的指针。正如您可能得出的结论,是的,仅通过指向第一个元素的指针是无法知道数组或字符串的长度的。出于这个原因,所有 C 字符串都附加了一个空字符'\0',它只是一个全零的字节,以检测字符串的结尾。对于数组,您必须传递长度(除了一些特殊的陷阱,我将在此处跳过)。

在您的程序中,该malloc()函数分配fsize+1字节并返回指向第一个字节的指针,然后由pan_protocol_get_image()

作为 C 程序员,您有责任确保从函数返回的指针指向字符串的第一个字符,并且字符串具有空终止符。

只需将返回值用作普通字符串即可。还要注意您不知道此函数返回的缓冲区(字符串)的长度。

于 2013-07-18T11:10:14.353 回答
1

您无需更改返回类型。您可以直接取消引用malloc()通过使用索引分配的内存区域。您正在返回数组的基地址。因此,通过向该地址添加索引,您可以直接访问分配的内存。你可以这样访问,

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

psize由函数设置,如果未发送 NULL,则在此处

if (psize) *psize = fsize;

所以,从外面你应该能够做到这一点:

for (unsigned long i = 0; i<psize; ++i) {
    //do something with result[i] }
}

完成后不要忘记释放result它。

于 2013-07-18T11:13:55.323 回答