2013-03-05 39 views
0

我需要分配t2但我不知道具體如何。函數返回C中的反向字符串 - 分配

char *reverse(char *t) 
{ 
    int length= strlen(t); 
    char *t2 = (char *) malloc(length * sizeof(char*)); 
    for(int i= (length-1);i>=0;i--) 
     t2[i]=t[length-1]; 
    return t2; 
} 

請幫忙嗎?

+0

您需要爲特殊''\ 0''字符指示字符串的結尾分配一個多字節。 – Maroun 2013-03-05 19:35:17

+0

@Maroun,OP的問題幾乎可以肯定的是,他在這種情況下分配了太多的內存 - 注意乘以指針大小。 – 2013-03-05 19:35:57

+0

@CarlNorum哦..我錯過了......當然,在這個修復之後,他需要再分配一個字節:) – Maroun 2013-03-05 19:36:34

回答

2

有與多個代碼錯誤。

前面提到的sizeof(char) != sizeof(char*)前者是char的大小,第二個是指針的大小。

另外,僅環分配相同的值,所有指標在T2 t2[i]=t[length-1];

此外,還應採取const char*作爲參數,所以即使爲const char *字符串可以傳遞給它。

沒有空字符\0被設置在字符串的末尾。

此代碼應該這樣做:

char* reverse(const char *t) 
{ 
    int length= strlen(t); 
    char* t2 = (char*)malloc((length+1) * sizeof(char)); 
    for(int i=0;i<length;i++) 
    { 
     t2[(length-1)-i]=t[i]; 
    } 
    t2[length] = '\0'; 
    return t2; 
} 
3

你很近。

char *t2 = malloc(length + 1); // reserve space for a null terminator 

你可能想這個循環在length開始,而不是length - 1,雖然。循環內的賦值也是錯誤的(您只更改目標位置,而不是源代碼)。確保在返回字符串之前終止該字符串。

編輯注:

  1. 你不需要投在C程序的malloc()返回值。
  2. sizeof(char)1 - 無需乘法。
  3. 根據您要查找的語義,您可能根本不需要malloc()。串逆轉可以就地完成在C.
+0

@AdrianJandl真的嗎?指針在64位系統上是4個字節?在嵌入式8位或16位系統中如何?你的評論是錯誤的 - 指針的sizeof是平臺特定的。 – 2013-03-05 19:48:05

+0

@NikBougalis實際上你是對的,我一直忘記這一點,因爲我只在一臺指針長度爲4字節的機器上工作,我的不好。 – 2013-03-05 19:51:09

0
char *t2 = malloc(length*sizeof(char) + 1); 

你的malloc一個指針零終止類型char加一

+2

爲什麼不簡單地'長度+ 1'? – 2013-03-05 19:36:43

+0

你是對的,但這是char的唯一情況。所有其他類型乘以它們的大小,所以爲什麼不在這裏爲對稱的原因 – 2013-03-05 19:38:18

+0

@VladLazarenko這也是更清楚,所以OP可以更好地理解分配。 – Maroun 2013-03-05 19:38:44