2013-10-18 74 views
0

我已經創建了這個小程序來反轉一個句子。 所以給出:A B C d反向字符串realloc():無效的下一個大小

它會給:d C B A

這工作得很好,直到我添加一個額外的信。如果我嘗試 「ABCDE」 將在最後一個失敗的錯誤

的realloc():無效的下一個大小:0x0000000000602010 *

這裏是我依然代碼

#define MAX_TEXT 100 

#include <stdio.h> 
#include <string.h> //strlen 
#include <stdlib.h> //realloc 


int main(int argc, char **argv) { 
    char text[MAX_TEXT] = { 0 };  
    char *parts = NULL; 

    printf("Insert string: "); 
    fgets(text,MAX_TEXT,stdin); 
    sscanf(text,"%[^\n]",text); //remove the \n 


    char **reverse = NULL; 
    char **extra = NULL; 
    int size = 0; 
    int i = 0; 

    parts = strtok (text," "); 
    while (parts != NULL) { 

     size += ((strlen(parts)+4) * sizeof(char)); 
     extra = realloc(reverse,size); 

     if (extra) { 
      reverse = extra; 
      reverse[i++] = parts; 
     }  
     else { 
      printf("Error allocating memory\n"); 
      exit(1); 
     } 

     parts = strtok (NULL, " "); 
    } 

    while (--i >= 0) { 
     printf("%s ",reverse[i]);     
    } 

    printf("\n"); 
} 

使用指針的新手別指望指針,所以任何幫助都會很棒。 謝謝!我試過使用valgrind,它只是指出在realloc上有什麼錯誤,但我不明白究竟是什麼。

更新的代碼:

#define MAX_TEXT 500 

#include <stdio.h> 
#include <string.h> //strchr 
#include <stdlib.h> //realloc 


int main(int argc, char **argv) { 
    char text[MAX_TEXT] = { 0 };   

    printf("Insert string: "); 
    fgets(text,MAX_TEXT,stdin); 
    //sscanf(text,"%[^\n]",text); //remove the \n <-- Undefined behaviour :D "if copying takes place between objects that overlap, the behavior is undefined." 
    char *theEnter = strchr(text,'\n'); 
    if (theEnter) { 
     *theEnter = 0;//remove \n 
    }   

    char **reverse = NULL; 
    char **extra = NULL; 
    char *parts = NULL; 
    int size = 0; 
    int i = 0; 
    size_t increse_by = sizeof(char *); 

    parts = strtok (text," "); 
    while (parts != NULL) { 

     size += increse_by; //pointer to pointer so increase by the size of new pointer 
     extra = realloc(reverse,size); 

     if (extra) { 
      reverse = extra; 
      reverse[i++] = parts; 
     }  
     else { 
      printf("Error allocating memory\n"); 
      exit(1); 
     } 

     parts = strtok (NULL, " "); 
    } 

    while (--i >= 0) { 
     printf("%s ",reverse[i]);     
    } 

    printf("\n"); 
} 

繼查理·伯恩斯表示,我現在分配對於char *,我也去掉了sscanf函數和使用,和strchr刪除\ N,因爲,作爲chux表示,自己在做什麼了未定義的行爲。

感謝您的幫助:)

+0

工作正常。檢查這個鏈接http://ideone.com/ly8ws2 – Arpit

+0

這意味着什麼。 OP得到未定義的行爲 –

+2

當他真的應該爲char *數組分配空間時,OP爲char *和字符串本身分配空間。 –

回答

2

您的realloc沒有分配足夠的空間。 sizeof(char *)在你的機器上可能是8。 下面的realloc將爲strlen的部分== 1分配(1 + 4)* 1 = 5。這對於字符串指針是不夠的。

嘗試改變

size += ((strlen(parts)+4) * sizeof(char)); 

size += sizeof(char *); 

原因是extrareverse是字符**。所以他們是一個指向字符串的指針數組。這個數組通過strtok()每個循環得到一個更大的數組。 strtok()返回一個以空字符結尾的字符串。所以你不需要爲此分配內存。

你不需要在這種情況下,但你也可以這樣做:

reverse[i++] = strdup(parts); 

如果你想在字符串中reverse指向字符串的副本text,內部沒有text本身。

+1

關於'sscanf(text,「%[^ \ n]」,text)''的任何想法?要麼是新穎的,要麼是UB。我正在思考它是由於'int sscanf(const char * restrict s,const char * restrict format,...)'中的'restrict'而引起的UB。 – chux

+0

@chux,我真的很老派沒有跟上最近的變化,包括限制。所以我不能聰明地對此發表評論。如果限制意味着指針不應該重疊,那麼我認爲你有一點。 –

+0

@chux,你的問題很好,你應該問一下,比如說StackOverflow,看看有哪些人不得不說。 –