我有以下用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;
}
据我所知,上面的函数返回一个指向字符的指针(而不是一个字符数组)。我对么?
如果是这种情况,如何将函数结果(即指向字符的指针)转换为字符数组,以便我可以逐个读取它们?
答案 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
。