2013-03-09 58 views
0
#include<stdio.h> 
#include<string.h> 
#include<malloc.h> 
char *str_rev(char s[]){ 
static char *st = NULL; 
static char *l; 
int i = 0,c = 0; 
st = malloc((strlen(s) * sizeof(*s))+1); 
*l = st; 
if(s == NULL){ 
    return "INVALID PARAMS"; 
} 
for(i=0;s[i]!='\0';i++){ 
; 
} 
for(c=i;c >=0;c--){ 
    *l++ = s[c]; 
} 
l = '\0'; 

return st; 
} 
int main(){ 
char a[]="Angus Declan R"; 
printf("\n %s \n",str_rev(a)); 
return 0; 
} 

如何釋放在func str_rev()中使用malloc()分配的內存,因爲我需要重新運行反向字符串。顛倒C中的字符串

+3

前這是您真正的代碼?它不會編譯。 – 2013-03-09 19:07:13

+1

請用問題陳述和幾句話來解釋您的解決方案,以改善您的問題。 – 2013-03-09 19:07:27

+1

@ nm:是的,這是我的真實代碼。它的編譯,但字符串沒有得到相反的順序打印。 – Angus 2013-03-09 19:11:10

回答

5

(1):在l首先內存是\0由於以下原因,這就是原因所在打印什麼:

你的循環後

for(i=0;s[i]!='\0';i++){ 
; 
} 

s[i]成爲\0和分配c=i和第二個循環之後,您在l的第一個點處分配\0

for(c=i;c >=0;c--){ 
    *l++ = s[c]; // you are assigning `\0` for first time 
} 

您返回return l;,並在第一位置l\0是如此 所以在printf語句與%s

printf("\n %s \n",str_rev(a));  

打印什麼。

建議:

for(c=i-1;c >=0;c--){ 
    //^c should be i-1 initially 
    *l++ = s[c]; 
} 

(2):你在,以免有問題的代碼兩個編譯錯誤。您在兩個位置

return "INVALID PARAMS"; 
         ^

下一個

char a[]="Angus Declan R"; 
         ^

第三嚴重的錯誤

你是返回無效的內存地址忘記;
你在做什麼,在st分配內存,然後將分配給l,然後free(st)並返回l:(閱讀評論

st = malloc((strlen(s) * sizeof(*s))+1); // allocation 
l = st;   // assign to l 

// code in between 

free(st); // st and l become invalid after free 
return l; // returning invalid memory 

建議:你ALGO工作,l並返回st無打電話免費()。

(4)

這不是錯誤,但爲什麼這個沒用的循環?

while(c > 0){ 
    l--; 
    c--; 
} 

(5):忘記*在l

for(c=i;c >=0;c--){ 
    *l++ = s[c]; 
} 
    l = '\0'; 
^ forgot * it should be *l = '\0'; 
+0

你是對的。對不起,我有錯別字錯誤,因爲我無法從VMWare複製和粘貼它,所以我將它記錄在記事本中並將其複製到此處。 – Angus 2013-03-09 19:47:09

+1

@Angus它不正確。在發佈問題之前,您應該嘗試足夠的努力。如果您有任何疑問,請告訴我。 – 2013-03-09 19:48:54

+0

我已經介紹過內存鏤空。 – Angus 2013-03-09 19:49:16