0

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

这是我的代码的一部分:

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

谢谢,

4

1 回答 1

6

以下行有几个问题:

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

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

现在您不需要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;
}

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

于 2012-08-07T12:43:12.750 回答