2012-06-25 32 views
0

我遇到了一些嚴重的麻煩與此功能:當跟蹤到達realloc,它爆炸。我已經檢查過有關此主題的類似問題,但沒有任何結果。我希望你能幫助我。你看到有什麼不對嗎?realloc():無效的下一個大小C轉儲

char **tokenizepath(char *path){  

    char str[256]; // buffer; 
    char **token=NULL; 
    char *saveptr; 
    int i=1; 
    size_t tam = sizeof(char*); 

    token = malloc(2 * tam); 
    strcpy(str, path); 

    if(str[0]=='\\'){ 
     token[0] = "\\"; 
     token[i++] = strtok_r(str, "\\", &saveptr); 
    }else{ 
     token[0] = strtok_r(str, "\\", &saveptr); 
    } 

    while((token[i]=strtok_r(NULL, "\\", &saveptr))!=NULL){ 
     i++; 
     token = realloc(token, (i+1)*sizeof(char*)); 
    } 

    return token; 

} 

這裏是回溯:提前

* glibc detected * /home/vlad/workspace_SisOp/RFSDev/Debug/RFSDev: realloc(): invalid next size: 0x0000000000605290 *** 
======= Backtrace: ========= 
/lib/x86_64-linux-gnu/libc.so.6(+0x7a6e6)[0x7ffff7ab56e6] 
/lib/x86_64-linux-gnu/libc.so.6(+0x7d3e7)[0x7ffff7ab83e7] 
/lib/x86_64-linux-gnu/libc.so.6(realloc+0xf9)[0x7ffff7ab9b39] 
/home/vlad/workspace_SisOp/RFSDev/Debug/RFSDev[0x40319b] 
/home/vlad/workspace_SisOp/RFSDev/Debug/RFSDev[0x400c31] 
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xed)[0x7ffff7a5c30d] 
/home/vlad/workspace_SisOp/RFSDev/Debug/RFSDev[0x400aa9] 
======= Memory map: ======== 
00400000-00404000 r-xp 00000000 00:14 542669        /home/vlad/workspace_SisOp/RFSDev/Debug/RFSDev 
00603000-00604000 r--p 00003000 00:14 542669        /home/vlad/workspace_SisOp/RFSDev/Debug/RFSDev 
00604000-00605000 rw-p 00004000 00:14 542669        /home/vlad/workspace_SisOp/RFSDev/Debug/RFSDev 
00605000-00626000 rw-p 00000000 00:00 0         [heap] 
7ffff0000000-7ffff0021000 rw-p 00000000 00:00 0 
7ffff0021000-7ffff4000000 ---p 00000000 00:00 0 
7ffff5ad9000-7ffff5aee000 r-xp 00000000 08:16 526333      /lib/x86_64-linux-gnu/libgcc_s.so.1 
7ffff5aee000-7ffff5ced000 ---p 00015000 08:16 526333      /lib/x86_64-linux-gnu/libgcc_s.so.1 
7ffff5ced000-7ffff5cee000 r--p 00014000 08:16 526333      /lib/x86_64-linux-gnu/libgcc_s.so.1 
7ffff5cee000-7ffff5cef000 rw-p 00015000 08:16 526333      /lib/x86_64-linux-gnu/libgcc_s.so.1 
7ffff5cef000-7ffff7a3b000 rw-p 00000000 00:14 273074      /home/vlad/Sistemas Operativos/ext2.disk 
7ffff7a3b000-7ffff7bd2000 r-xp 00000000 08:16 526221      /lib/x86_64-linux-gnu/libc-2.13.so 
7ffff7bd2000-7ffff7dd1000 ---p 00197000 08:16 526221      /lib/x86_64-linux-gnu/libc-2.13.so 
7ffff7dd1000-7ffff7dd5000 r--p 00196000 08:16 526221      /lib/x86_64-linux-gnu/libc-2.13.so 
7ffff7dd5000-7ffff7dd6000 rw-p 0019a000 08:16 526221      /lib/x86_64-linux-gnu/libc-2.13.so 
7ffff7dd6000-7ffff7ddc000 rw-p 00000000 00:00 0 
7ffff7ddc000-7ffff7dfd000 r-xp 00000000 08:16 523159      /lib/x86_64-linux-gnu/ld-2.13.so 
7ffff7fe2000-7ffff7fe5000 rw-p 00000000 00:00 0 
7ffff7ff9000-7ffff7ffb000 rw-p 00000000 00:00 0 
7ffff7ffb000-7ffff7ffc000 r-xp 00000000 00:00 0       [vdso] 
7ffff7ffc000-7ffff7ffd000 r--p 00020000 08:16 523159      /lib/x86_64-linux-gnu/ld-2.13.so 
7ffff7ffd000-7ffff7fff000 rw-p 00021000 08:16 523159      /lib/x86_64-linux-gnu/ld-2.13.so 
7ffffffde000-7ffffffff000 rw-p 00000000 00:00 0       [stack] 
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0     [vsyscall] 

謝謝!

回答

3

如果第一個測試是TRUE:

if(str[0]=='\\'){ 

那麼在第一次迭代下面的while循環:

while((token[i]=strtok_r(NULL, "\\", &saveptr))!=NULL){ 

我== 2和您試圖訪問token[2]它一直前分配。


另一個問題:如果通話結束後,token陣列移動到的realloc(因爲realloc的不能沒有移動它增加的大小),然後saveptr將不再有效。

+0

謝謝,但我改變了初始的令牌= malloc(2 * tam); for token = malloc(3 * tam);並沒有工作,仍然是相同的錯誤uu – Vladimir

+0

你需要一步一步在你的調試器中的代碼,看看發生了什麼 –

+0

我做了,它只是當程序達到realloc調用 – Vladimir

相關問題