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

realloc()返回的值给出了分段错误,c,memory-management,gcc,cygwin,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

但这给了我们一个机会

#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 ++;
            }
我不知道如何解决这个问题!实际上,我不确定这是否真的是分段错误。

您使用的是BUF#U大小的定义版本

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)
您应该使用存储在buf_size中的计算值

realloc(buf, BUF_SIZE);

我还没有详尽地研究过您的代码,但您真的想用
BUF_SIZE
(这是一个固定的预处理器常量)而不是
BUF_SIZE
调用
realloc()
?通常情况下,使用具有不同值和用途的符号(部分原因是这些类型的错误)是不好的做法。

您正在计算buf_size,但您没有在
realloc
中使用它。我想应该是这样

realloc(buf, buf_size); 
目前,您继续以10码的大小重新分配

tbuf = realloc(buf, buf_size); // not BUF_SIZE
您从不初始化
pBuf
。此外:

*pbuf ++= *p++, hsize ++;
应该是:

tbuf = realloc(buf, BUF_SIZE);
编辑:


正如@ouah在评论中所指出的,考虑到您确实初始化了
pBuf
(尽管我们看不到),您操纵
p
的方式似乎是罪魁祸首。
html
的类型和内容是什么?它是空终止的吗?您的
*(p+n)
表达式是否超出了其有效边界?

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

您有两个致命问题:

  • pbuf
    在init时被分配了
    buf
    的值,但此后从未更新
    realloc
    不保证在
    malloc
    之后返回相同的地址(以及随后的
    realloc
    调用)

  • 在调用所需的
    realloc
    之前,您在此处溢出了
    pbuf

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



  • 这仍然不能解释SEGFULT。@哎呀:
    pBuf
    从未初始化,但被解除引用。这就是seg故障的原因。@EdS。他应该把这个放在answer@trumpetlicks:是的,我看到了,但由于我不知道它没有显示给我们,我假设对该指针所做的一切都是有效的。有点像,但是我想既然你的答案提到了从不初始化,我就在你的下面做个评论,而不是留下另一个答案:-)@Jack在这种情况下看,
    html
    是以空结尾的,
    strlen((char*)html)
    =2
    @ouah-这就是我的意思!!!他基本上是通过p移动的,但是p是用(char*)html初始化的@哇哇:我认为你应该把它作为一个答案,因为考虑到pBuf的反馈,它似乎是罪魁祸首。你是对的。非常感谢!我已经修复了它,但是我得到了同样的错误。@Jack,正如其他人指出的,segfault很可能是因为您没有初始化
    pBuf
    。我是在我的真实代码中完成的。但是当我在这里编辑的时候,我忘了重新键入它。变量html来自哪里?是的,请告诉我们
    html
    @Jack:这没有帮助。当然你知道它的基本类型,可以在这里发布它的内容。@EdS:添加了一个更真实的例子。我试图只从HTTP头中获取一些值。@Jack我发布了一个答案,列举了您程序中的问题。我尝试了:
    tbuf=realloc(buf,buf_size);如果(tbuf!=NULL){buf=tbuf;pbuf=buf;
    但是看起来我溢出了旧的值,只得到了最后8个字符。你能给出一个简单的代码示例如何做到这一点吗?你需要这样的东西:
    pbuf=tbuf+(pbuf-buf);
    非常感谢!如果可以的话,我会+10!另一个问题:在后续的
    realloc()
    调用之后,我会丢失旧的值,正如您在第二点中提到的。如何解决这个问题?@Jack:如果您还有其他问题,!注释并不是这样的地方。
    tbuf = realloc(buf, buf_size);