[英]Segmentation fault while implementing reverse function in C
我決定在C語言中制作一個reverse(s)
函數,在此過程中,我在編譯過程中遇到了2條警告消息。
alexander@debian:~/Dropbox/GitRepo/M2MPL/text$ make reverse
cc reverse.c -o reverse
reverse.c: In function 'reverse':
reverse.c:29:2: warning: return makes integer from pointer without a cast [enabled by default]
reverse.c:29:2: warning: function returns address of local variable [enabled by default]
alexander@debian:~/Dropbox/GitRepo/M2MPL/text$
由於它們是警告,因此當我使用scanf("%s", str1);
輸入字符數組Dropbox
時,我試圖忽略它們並運行程序scanf("%s", str1);
結果顯示為Segmentation Fault
。
alexander@debian:~/Dropbox/GitRepo/M2MPL/text$ ./reverse
Enter a string to reverse: Dropbox
Segmentation fault
alexander@debian:~/Dropbox/GitRepo/M2MPL/text$
這是我對reverse(s)
函數的實現:
/* reverse: returns a reversed string of s */
char reverse(char s[])
{
int i, len=strlen(s);
char result[LIMIT];
for (i = len; i >= 0; --i) {
result[len-i] = s[i];
}
return result;
}
我需要幫助來了解為什么我得到了Segmentation fault
而不是xobporD
Segmentation fault
,如果可能的話,還提出了解決此問題的建議。
首先:
編譯器不會僅僅出於娛樂目的而警告您。 如果您忽略編譯器警告,則程序不會崩潰,您不會感到驚訝。
您將指針返回到在函數末尾超出范圍的自動變量。 返回給調用方的指針無效,因為它指向reverse
函數返回后不再存在的對象。
另一個問題是,您復制的第一個字符為'\\0'
因此您得到的字符串為空。 您需要反轉字符串的字符,但仍將'\\0'
放在字符串的末尾。
第一個警告意味着由reverse
函數簽名指示的返回類型與您實際返回的變量的類型不匹配。 預期的類型為char
,並且您將返回一個char *
(因為result
會衰減到這樣的指針)。 因此,編譯器將指針轉換為整數( char
),這通常不是程序員想要的。
第二個問題是您正在返回局部變量的地址,並且由於自動存儲的工作方式,該變量在函數返回后不再可用。 如果要返回指向某些數據的指針,則必須全局分配(在函數內部聲明為static
或全局聲明),或者必須動態分配。
問題代碼中存在一些缺陷。
以下代碼修復了上述問題。 它將分配的“堆”內存中的字符串返回給調用方。 (當不再需要內存時,調用者應釋放()內存。):
/* reverse: returns a reversed string of s */
char *reverse(char *s)
{
int i, len=strlen(s);
char *result = malloc(len+1);
if(result)
{
result[len] = '\0';
for(i = len; i >= 0; --i)
result[len-i] = s[i];
}
return(result);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.