#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)
我不知道如何解决这个问题!实际上,我不确定这是一个真正的分段错误。
答案 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)
你有两个致命的问题:
pbuf
在init处被赋予buf
的值,但永远不会更新。在realloc
(以及随后的malloc
来电)后,realloc
无法保证返回相同的地址。
在调用必需的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
不再有效,但您取消引用它。