-2

重複の可能性:
他の関数を参照してバッファーを渡す

関数astを呼び出すと、データはbufferとbufferlenに保存されますが、decからこのポインターにアクセスしようとすると、* bufferlenを出力できますが、*bufferは不可能です。

temp = bufferを実行すると、セグメンテーション違反が発生します。デバッガーでは、バッファーに「アドレス0x7fが範囲外です」と表示されます。decからバッファを印刷するにはどうすればよいですか?エラーはどれですか?

  void ast(KOCTET *buffer,KUINT16 *bufferlen){
        KOCTET  *Bufferencode,*temp;
        KUINT16 BufferSize=5000;
        KUINT16 WritePos=0;
        KUINT16 total_bytes;
        Bufferencode=(KOCTET*)malloc(5000*sizeof(KOCTET));
        memset(Bufferencode,0,sizeof(Bufferencode));

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

        buffer=Bufferencode;
        *bufferlen=total_bytes;

        int z=0;
        temp=buffer;
        while (z<(*bufferlen)){
           printf(" %02X",(unsigned char)*temp);
           temp++;
           z++;
        }
        printf("\n");

    }


    void dec()
    {
       KOCTET *buffer,*temp;
       KUINT16 *bufferlen;

       ast_process_048(buffer,bufferlen);


       int z=0;
       temp=buffer;
       while (z<(*bufferlen)){
         printf(" %02X",(unsigned char)*temp);
         temp++;
         z++;
       }
       printf("\n");

    }
4

1 に答える 1

1

コードにはいくつかの問題があります。

  1. 以前にメモリを割り当てずに、数回アクセスastします。*bufferlen
  2. ステートメントで外部でさらに使用するBufferencodeために、に割り当てられたメモリを引き渡したいと思います。ただし、これには次のものが必要です。bufferastbuffer=Bufferencode;

    void ast(KOCTET **buffer, ...)
    {
        ...
        *buffer = Bufferencode;
        ...
    }
    
    void dec()
    {
        KOCTET *buffer;
        ...
        ast_process_048(&buffer,...);
        ...
    }
    

これらは最初の明らかな問題にすぎません-もっとあるかもしれません。昨日の質問に対する回答の提案を検討し、おそらく、基本的なCプログラミングとポインター処理についてもう少し学びましょう。

于 2012-08-08T08:19:10.093 に答える