2
#define BUF_SIZE 10

char *html = "foo:baa\r\nxxx:yyyy:\r\nLocation:........................................\r\Connection:close\r\n\r\n";
char *p = (char*)html, *buf, *pbuf, *tbuf;
int buf_size = BUF_SIZE, hsize = 0;

 if((buf = malloc(buf_size)) == NULL) FAILED("NO MEMORY!\n");
   pbuf = buf;

    while(*p != '\0' && *(p + 1) != '\r' && *(p + 2) != '\n') {
                    if((hsize + 1) >= buf_size) {
                        printf("Do realloc!\n");
                        buf_size += BUF_SIZE + 2; 
                        tbuf = realloc(buf, buf_size); // BUF_SIZE 
                        if(tbuf != NULL) {
                            buf = tbuf;
                        } else {
                            printf(" NO MEMORY!\n");
                            exit(1);
                        }
                    }

                    *pbuf ++= *p++, hsize ++;
            }

しかし、それは

Do realloc!
Do realloc!
Stack trace:
Frame     Function  Args
0022A814  7798EFA3  (000000FC, 0000EA60, 00000000, 0022A948)
0022A828  7798EF52  (000000FC, 0000EA60, 000000A4, 0022A924)
0022A948  610DB059  (00000000, 00000001, 0022A978, 0000000C)
0022AA38  610D841E  (00000000, 61102908, 003B0023, 00230000)
0022AA98  610D88EE  (20038878, 0000000C, 0022AAC8, 00000006)
0022AB48  610D8A40  (00000E3C, 00000006, 00000001, 20010340)
0022AB68  610D8A6C  (00000006, 0022CE80, 0022ABD4, 20038883)
0022AB98  610D8CF5  (004031AA, 20010340, 0022ABE8, 61138596)
20010348  6110F935  (73756A2E, DF0DF02E, 200000C8, 00000000)

これを修正する方法がわかりません!実際、それが本当にセグメンテーション違反であるかどうかはわかりません。

4

6 に答える 6

3

2つの致命的な問題があります。

  1. pbufbufat initの値が割り当てられますが、更新されることはありません。(および後続の呼び出し)後にrealloc同じアドレスを返すことは保証されていません。mallocrealloc

  2. pbuf必要なものを呼び出す前に、ここでオーバーフローしていますrealloc

    *pbuf ++= *p++, hsize ++;

于 2012-06-27T21:23:04.477 に答える
3

BUF_SIZE の #define バージョンを使用しています。

realloc(buf, BUF_SIZE);

buf_size に格納されている計算値を使用する必要があります。

realloc(buf, buf_size); 
于 2012-06-27T20:42:36.067 に答える
3
*pbuf ++= *p++, hsize ++;

を初期化することはありませんpBuf。また:

tbuf = realloc(buf, BUF_SIZE);

次のようにする必要があります。

tbuf = realloc(buf, buf_size);

編集:

@ouah がコメントで指摘したように、実際に初期化を行っていることを考えるとpBuf(見えませんが)、操作方法pが原因である可能性が高いようです。の種類と内容はhtml?nullで終了していますか?*(p + n)有効な境界を超えている式はありますか?

于 2012-06-27T20:42:53.807 に答える
2

私はあなたのコードを徹底的に調べたわけではありませんが、本当に(これは固定のプリプロセッサ定数です) ではなく でrealloc()呼び出すつもりですか? 一般に、大文字と小文字のみが異なる異なる値と目的を持つシンボルを使用することはお勧めできません (これらの種類のエラーが原因の 1 つです)。BUF_SIZEbuf_size

于 2012-06-27T20:42:47.240 に答える
1

他の多くの回答で言及されている多くのバグに加えて、を呼び出した後reallocpbufは無効になりますが、それを逆参照します。

于 2012-06-27T21:22:07.847 に答える
1

を再計算buf_sizeしていますが、 で使用していませんrealloc。そうあるべきだと思う

tbuf = realloc(buf, buf_size); // not BUF_SIZE

現在、サイズ 10 で再割り当てを続けています。

于 2012-06-27T20:42:50.433 に答える