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

您正在使用 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什么?它是否为空终止?您的任何*(p + n)表达式是否超出了它的有效范围?

于 2012-06-27T20:42:53.807 回答
3

你有两个致命的问题:

  1. pbuf分配了bufat init 的值,但从不更新。realloc不保证在malloc(以及随后的realloc调用)之后返回相同的地址。

  2. pbuf在调用 required 之前,您在这里溢出realloc

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

于 2012-06-27T21:23:04.477 回答
2

我没有详尽地查看您的代码,但是您真的是要调用realloc()with BUF_SIZE(这是一个固定的预处理器常量),而不是buf_size? 具有仅因大小写而异的具有不同值和目的的符号通常不是一个好习惯(部分原因是这些错误)。

于 2012-06-27T20:42:47.240 回答
1

您正在重新计算buf_size,但您没有在realloc. 我认为应该是

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

目前,您继续以 10 大小重新分配。

于 2012-06-27T20:42:50.433 回答
1

除了许多其他答案中提到的许多错误之外:在您调用之后reallocpbuf不再有效,但您取消引用它。

于 2012-06-27T21:22:07.847 回答