【问题标题】:Pointer to char into char array指向 char 的指针到 char 数组
【发布时间】:2013-07-18 11:06:01
【问题描述】:

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

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

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

【问题讨论】:

  • 从技术上讲,它是一个指向字符的指针。准确地说,它指向一个字符所在的内存位置。但是,没有什么可以阻止该字符后面跟着一些其他字符 - 这是有道理的,因为分配给malloc 的内存块似乎比1 大。您可能可以通过该指针有效地访问一个字符数组。
  • 上面的代码实际上是指向一个字符流/数组,而不是单个字符。因此您可以读取作为字符数组返回的结果。
  • 鉴于它确实 malloc(fsize + 1);,我想知道是否打算添加尾随 \0

标签: c arrays pointers malloc


【解决方案1】:

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

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

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

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

只要把返回值当作普通字符串使用就可以了。还要注意您不知道此函数返回的缓冲区(字符串)的长度。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 谢谢!很高兴知道有时事情比我想象的要容易
    【解决方案3】:

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

    if (psize) *psize = fsize;
    

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

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

    完成后不要忘记释放result

    【讨论】:

    • 感谢大家对该函数的精彩解释。我以前从未使用过 malloc,所以我不确定它做了什么。再次感谢,真的很有帮助
    • @elrim 考虑打勾以获得有用的答案 - 去查找 malloc 和 free :-)
    • 我试图投票给所有有用的答案,但它告诉我我需要更多的声誉才能做到这一点:(太不公平了
    猜你喜欢
    • 2021-01-26
    • 2018-04-05
    • 2012-03-19
    • 1970-01-01
    • 1970-01-01
    • 2016-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多