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;

最初の 2 つはメモリを割り当て、そのポインタをローカル変数へのポインタで上書きします。これは、関数が戻るときに無効になります。次の 2 行も同様です。したがって、これらの 4 行では、2 つのメモリ リーク (メモリを割り当ててから、そのメモリへのポインタを変更して使用できないようにする) と、スタック内でのみ有効なスタック上の場所を指すようにポインタを設定すると、未定義の動作が発生します。関数。

これらの問題を解決するには、次のように変更します。

*bufferlist = Buffer;
*lenlist = total_bytes;

編集:この関数を間違って呼び出していることにも注意してください:

KOCTET**bufferlist;
KUINT16*lenlist;

process(bufferlist,lenlist);

これは次のように変更する必要があります。

KOCTET *bufferlist;
KUINT16 lenlist;

process(&bufferlist, &lenlist);

KOCTETこれは、変数をおよびへのポインタとして宣言します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 に答える