将char指向char数组的指针

时间:2013-07-18 11:06:01

标签: c arrays pointers malloc

我有以下用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;
}

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

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

3 个答案:

答案 0 :(得分:2)

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

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

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

返回

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

只需将返回的值用作普通字符串,就可以了。还要小心你不知道这个函数返回的缓冲区(字符串)的长度。

答案 1 :(得分:1)

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

result[0],result[1],....

答案 2 :(得分:0)

psize由函数设置,如果没有发送NULL,这里

if (psize) *psize = fsize;

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

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

完成后,请不要忘记释放result