2012-06-27 3 views
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) 

Я понятия не имею, как это исправить! На самом деле, я не уверен, что это действительно ошибка сегментации. Любая помощь очень ценится. Заранее спасибо.

+0

Где переменный HTML взялся? – trumpetlicks

+0

Да, пожалуйста, сообщите нам содержимое и тип 'html'. –

+0

было предоставлено значение html. – Jack

ответ

3

У вас есть две фатальные проблемы:

  1. pbuf присваивается значение buf при инициализации, но тогда никогда не обновляется. realloc не может возвращать тот же адрес после malloc (и последующие realloc звонки).

  2. Вы переполнены pbuf здесь перед вызовом необходимого realloc:

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

+0

+1 хороший звонок здесь –

+0

Большое спасибо! Я бы +10, если бы мог! – Jack

+0

Другой вопрос: я теряю старые значения после последующих вызовов 'realloc()', как вы упомянули во второй точке. Как это исправить? – Jack

3

Вы используете #define версию BUF_SIZE.

realloc(buf, BUF_SIZE); 

Вы должны использовать вычисленное значение, которое хранится в buf_size.

realloc(buf, buf_size); 
+0

Это все еще не объясняет segfault. – ouah

+0

@ouah: 'pBuf' никогда не инициализируется, но есть * is * разыменовывается. Это объясняет неисправность seg. –

+0

@EdS. он должен поместить это в ответ – ouah

2

Я не смотрел на свой код исчерпывающе, но вы действительно значит называть realloc() с BUF_SIZE (который является фиксированной препроцессор константа), а не buf_size? Как правило, не очень хорошая практика иметь символы с разными значениями и целями, которые отличаются только случаем (частично из-за таких ошибок).

+0

Вы правы. Спасибо! Я исправил это, но я получаю такую ​​же ошибку. – Jack

+0

@Jack, как указывали другие, segfault, вероятно, потому, что вы не инициализировали 'pBuf'. –

+0

Я сделал это в своем реальном коде. Но когда я редактировал здесь, я забыл перепечатать его. – Jack

1

Вы пересчитываете buf_size, но вы не используете его в realloc. Я думаю, что это должно быть

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

В настоящее время, вы держите повторного выделения в размере 10.

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

Вы никогда не инициализировать pBuf. Также:

tbuf = realloc(buf, BUF_SIZE); 

Должно быть:

tbuf = realloc(buf, buf_size); 

EDIT:

Как @ouah отмечено в комментариях, и принимая во внимание, что вы на самом деле инициализации pBuf (хотя мы не можем видеть его), кажется, что способ, которым вы манипулируете p, является вероятным виновником. Каков тип и содержание html? Оканчивается ли оно нулем? Являются ли какие-либо из ваших выражений *(p + n) чрезмерными действительными границами?

+0

Также, где (char *) html, исходящий из ??? +1 – trumpetlicks

+0

@trumpetlicks: Да, я это видел, но, поскольку я понятия не имею, поскольку это не показано нам, я предполагаю, что все сделано, чтобы этот указатель действителен. –

+0

Kinda понял, но я думал, так как ваш ответ говорил о том, что никогда не инициализируется, я просто прокомментирую ваше мнение вместо того, чтобы попытаться оставить другой ответ :-) – trumpetlicks

1

В дополнение к многочисленным ошибкам, упомянутым в многих других ответах: После того, как вы позвоните realloc, pbuf уже недействителен, но вы его разыщите.

+0

Я попытался: 'tbuf = realloc (buf, buf_size); if (tbuf! = NULL) {buf = tbuf; pbuf = buf; 'Но похоже, что я переполняю старые значения, получая только последние 8 символов. Можете ли вы привести простой пример кода, как это сделать? – Jack

+0

Вам нужно что-то вроде: 'pbuf = tbuf + (pbuf - buf);' –

Смежные вопросы