【问题标题】:Pass a buffer by reference to other function通过引用其他函数来传递缓冲区
【发布时间】:2012-08-04 11:31:20
【问题描述】:

我想将缓冲区指针和缓冲区长度传递给其他函数,然后对这些数据进行操作并打印它。但是当我尝试在函数中打印它时是不可能的。

这是我的代码的一部分:

  void process(KOCTET**bufferlist,KUINT16*lenlist){
        KOCTET * Buffer,*temp;
        KUINT16 BufferSize=5000;
        KUINT16 WritePos=0;
        KUINT16 total_bytes;
        Buffer=(KOCTET*)malloc(5000*sizeof(KOCTET));

        total_bytes = stream.CopyIntoBuffer( Buffer, BufferSize, WritePos);

        bufferlist=(KOCTET**)malloc(sizeof(KOCTET*));
        bufferlist=&Buffer;
        lenlist=(KUINT16*)malloc(sizeof(KUINT16));
        lenlist=&total_bytes;

           //Print Buffer in Hexadecimal
           int z=0;
           temp=Buffer;
           while (z<total_bytes){
              printf(" %02X",(unsigned char)*temp);
              temp++;
              z++;
           }
           printf("\n");
    }


    void function ()
    {
         KOCTET**bufferlist;
         KUINT16*lenlist;

         process(bufferlist,lenlist);

         //Print Buffer in Hexadecimal
           int z=0;
           temp=*bufferlist;
           while (z<(*lenlist)){
              printf(" %02X",(unsigned char)*temp);
              temp++;
              z++;
           }
           printf("\n");
    }

谢谢,

【问题讨论】:

  • 您没有更改缓冲区列表和 lenlist。正如C FAQ 所述,您只是在更改它们的副本。 IE。对于function,就好像从未调用过process

标签: c function pointers


【解决方案1】:

以下行有几个问题:

bufferlist=(KOCTET**)malloc(sizeof(KOCTET*));
bufferlist=&Buffer;
lenlist=(KUINT16*)malloc(sizeof(KUINT16));
lenlist=&total_bytes;

前两个分配内存,然后用一个指向局部变量的指针覆盖指针,当函数返回时这将无效。接下来的两行也是如此。因此,在这四行中,您有两个内存泄漏(分配内存然后更改指向该内存的指针,因此它不再可用)以及当您将指针设置为指向仅在函数内部有效的堆栈。

要解决这些问题,请更改为以下内容:

*bufferlist = Buffer;
*lenlist = total_bytes;

编辑:我还注意到你调用这个函数是错误的:

KOCTET**bufferlist;
KUINT16*lenlist;

process(bufferlist,lenlist);

这应该改为:

KOCTET *bufferlist;
KUINT16 lenlist;

process(&bufferlist, &lenlist);

这将变量声明为指向KOCTETKUINT16 的指针。然后将这些变量的地址传递给process,制作它们的指针(即在bufferlist的情况下指向KOCTET的指针,在lenlist的情况下指向KUINT16的指针)。

现在您不需要在循环中使用 lenlist 的取消引用:

while (z < lenlist) {
    printf(" %02X", (unsigned char) *temp);
    temp++;
    z++;
}

这个循环现在实际上可以重写为:

for (z = 0; z < lenlist; z++)
    printf(" %02X", (unsigned char) bufferlist[z]);

编辑 2:解释指针和指针运算符(我希望)

让我们来看看这个示例程序:

#include <stdio.h>

int main()
{
    int a = 5;  /* Declares a variable, and set the value to 5 */

    int *p = &a;  /* Declares a pointer, and makes it point to the location of `a` */
    /* The actual value of `p` is the address of `a` */

    printf("Value of a: %d\n", a);  /* Will print 5 */
    printf("Value of p: %d\n", p);  /* Will print a large number */

    printf("The address of a: %d\n", &a);  /* Prints the same large number as `p` above */
    printf("The contents p: %d\n", *p);  /* Prints 5 */

    return 0;
}

我希望这个简单的程序能帮助你更多地理解指针,特别是 &amp;* 运算符之间的区别。

【讨论】:

  • 当我这样做时,我可以编译,但程序在那一行中断。我不应该为缓冲区列表分配内存吗?
  • @dani 你已经这样做了,为Buffer 分配内存,然后传递该内存。
  • 还有这个过程(&bufferlist, &lenlist);是 C++ 还是等于 process(*bufferlist,*lenlist);??
  • @dani 这与 C++ 无关。相反,我建议您阅读有关指针、“地址”运算符&amp; 和“指针取消引用”运算符* 的更多信息。
  • @dani 表达式&amp;bufferlist返回变量bufferlist的地址,而*bufferlist返回bufferlist指向的值。
猜你喜欢
  • 2017-01-21
  • 2013-12-09
  • 2015-12-09
  • 2010-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-12
  • 1970-01-01
相关资源
最近更新 更多