2010-07-01 45 views
1

有時,下面的代碼有效,這可能意味着很好的概念,但執行效果很差。由於這種崩潰取決於比特位置的下降,這意味着我正在逐步屠殺一步。我有興趣找到一個優雅的方式來填充bufferdata與< = 4096字節buffer,但毫無疑問,這不是它。錯誤使用memcpy連接字節塊中的字節

編輯:我收到的錯誤是bufferdata

unsigned char  buffer[4096] = {0}; 
char *bufferdata; 

bufferdata = (char*)malloc(4096 * sizeof(*bufferdata)); 
if (! bufferdata) 
    return false; 

while(...) 
{ 

    // int nextBlock(voidp _buffer, unsigned _length); 
    read=nextBlock(buffer, 4096); 

    if(read > 0) 
    { 
     memcpy(bufferdata+bufferdatawrite,buffer,read); 

     if(read == 4096) { 

      // let's go for another chunk 
      bufferdata = (char*)realloc(bufferdata, (bufferdatawrite + (4096 * sizeof(*bufferdata)))); 
      if (! bufferdata) { 
       printf("failed to realloc\n"); 
       return false; 
      } 

     } 

    } 
    else if(read<0) 
    { 
     printf("error.\n"); 
     break; 
    } 
    else { 
     printf("done.\n"); 
     break; 
    } 
} 


free(bufferdata); 
+0

它怎麼樣/它在哪裏失敗? bufferdatawrite從哪裏來?這需要增加... – 2010-07-01 17:17:11

回答

4

很難說錯誤在哪裏,這裏和那裏都有一些代碼丟失。

if(read == 4096) {看起來像個罪魁禍首,如果nextBlock,在一次迭代中返回4000,下一個返回97呢?現在您需要存儲4097個字節,但您不會重新分配緩衝區以適應它。

您需要累積字節,並在您通過4096邊界時重新分配。 這樣的東西:

#define CHUNK_SIZE 4096 
int total_read = 0; 
int buffer_size = CHUNK_SIZE ; 
char *bufferdata = malloc(CHUNK_SIZE); 
char buffer[CHUNK_SIZE]; 
while(...) 
{ 

    // int nextBlock(voidp _buffer, unsigned _length); 
    read=nextBlock(buffer, CHUNK_SIZE); 

    if(read > 0) 
    { 
     total_read += read; 
     if(buffer_size < total_read) { 
      // let's go for another chunk 
      char *tmp_buf; 
      tmp_buf= (char*)realloc(bufferdata, buffer_size + CHUNK_SIZE); 
      if (! tmp_buf) { 
       free(bufferdata); 
       printf("failed to realloc\n"); 
       return false; 
      } 
      buffer_data = tmp_buf; 
      buffer_size += CHUNK_SIZE ; 

     } 
     memcpy(bufferdata+total_read-read,buffer,read); 
     } 
     ... 
    } 
+0

您在memcpy之前增加了'total_read',這意味着memcpy會將'read'字節寫入緩衝區太遠。您需要'memcpy(bufferdata + total_read-read,buffer,read)'。 – 2010-07-01 17:37:13

0

非法訪問幾點意見:

請定義或const 4096如果你需要改變這一點,你就會引火燒身。重新分配鏈接是獲取緩衝區的極其低效的方式。任何方式你可以預取大小,並一次抓住它?也許不是,但是當我看到realloc()時我總是畏縮。我還想知道kZipBufferSize是什麼,以及它的字節數是否與您的其他計數一樣。另外,什麼是bufferdatawrite?我假設它是源數據,但我想看看它的聲明,以確保它不是內存對齊問題 - 這是什麼感覺。或者由於尺寸不合適而導致緩衝區溢出。

最後,你確定他們nextBlock是不是過度運行內存一些如何?這是代碼中潛在弱點的另一點。

+0

是的,你是正確的。我將這個常數轉換爲一個幻數,這裏僅用於說明目的。 (我已經編寫了代碼示例) – bitcruncher 2010-07-01 17:27:02