来自realloc()的返回值给出了分段错误

时间:2012-06-27 20:39:26

标签: c memory-management gcc cygwin

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

我不知道如何解决这个问题!实际上,我不确定这是一个真正的分段错误。

6 个答案:

答案 0 :(得分:3)

您正在使用BUF_SIZE的#define版本。

realloc(buf, BUF_SIZE);

您应该使用存储在buf_size中的计算值。

realloc(buf, buf_size); 

答案 1 :(得分:3)

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

您永远不会初始化pBuf。也:

tbuf = realloc(buf, BUF_SIZE);

应该是:

tbuf = realloc(buf, buf_size);

编辑:

正如@ouah在评论中指出的那样,考虑到你事实上初始化pBuf(虽然我们看不到它),但你操纵p的方式似乎是可能是罪魁祸首。 html的类型和内容是什么?是空终止了吗?您的*(p + n)个表达式是否超出了它的有效范围?

答案 2 :(得分:3)

你有两个致命的问题:

  1. pbuf在init处被赋予buf的值,但永远不会更新。在realloc(以及随后的malloc来电)后,realloc无法保证返回相同的地址。

  2. 在调用必需的pbuf之前,您在这里溢出realloc

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

答案 3 :(得分:2)

我没有详尽地查看您的代码,但您是否真的想要使用realloc()(这是一个固定的预处理器常量)而不是BUF_SIZE来调用buf_size?具有不同值和目的的符号通常不是很好的做法,这些符号仅根据情况而不同(部分原因是这些错误)。

答案 4 :(得分:1)

您正在重新计算buf_size,但您未在realloc中使用它。我认为应该是

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

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

答案 5 :(得分:1)

除了许多其他答案中提到的许多错误:在您致电realloc后,pbuf不再有效,但您取消引用它。