2012-10-18 92 views
1

在下面的代碼生成兼容的指針類型錯誤和警告:控制到達在文件名函數非void函數的結束:警告:從兼容的指針類型用C返回

#include <stdio.h> 
#include <stdlib.h>  

int quit; 
char *filename(int *); 

int main() 
{ 
    filename(&quit); 
    return 0; 
} 

char *filename(int *i1) 
{ 
    char input[16]; 
    char *dum=(char*)malloc(16*sizeof(char));  
    if (dum==NULL){ 
     printf("Memory could not be allocated \n"); 
    } 
    else { 
     printf("Memory was allocated – remember to free\n \n");  
     *i1=1;  
     fputs("Input filename = ", stdout); 
     fflush(stdout); 
     fgets(input,sizeof(input),stdin);  
     printf("Filename = \"%s\"\n",input); 
     return i1; 

    } 
} 

我的新本,有人可以幫我解決這個錯誤嗎?

+0

您的'main'函數在不使用返回值的情況下調用'filename',爲什麼函數需要返回任何東西? – Barmar

+0

其實,問題應該是:爲什麼'main'不使用返回值?你打印「記得要自由」,但是永遠不要釋放它。 – Barmar

回答

3

嗯,是嗎?該函數聲明返回char *,但返回i1,它是輸入參數,並且類型爲int *

你可能意味着返回新分配的字符串dum,或許也與使用fgets()到單獨的字符數組input讀取的數據填充它。在這種情況下,您需要複製數據,並返回dum

這將是更簡潔,更簡單,通常不如直接讀入dum

fgets(dum, 16, stdin); 

return dum; 

注意,這個複製從malloc()通話,這是一個「代碼味道」的緩衝區的大小。這可以通過它在函數的局部恆定的改善:

char * filename(void) 
{ 
    const size_t max_fn = 16; 
    char *dum; 

    if((dum = malloc(max_fn)) != NULL) 
    { 
    if(fgets(dum, max_fn, stdin) != dum) 
    { 
     free(dum); /* Input failed, free the buffer and drop the pointer. */ 
     dum = NULL; 
    } 
    } 
    return dum; 
} 

我後面的代碼也有它檢查的,可以失敗函數的返回值的好處。內存分配(malloc())和I/O(fgets())都可能失敗,因此您必須檢查其返回值。

+0

非常感謝你,就像我說的,我是新來的,你的評論幫了很多忙:) –

1

除了放鬆什麼說你應該行printf("Memory could not be allocated \n");

1

好後返回的東西,首先,你的縮進是慘不忍睹。再次縮進這使得它更清晰一點是怎麼回事:

char *filename(int *i1) 
{ 
    char input[16]; 
    char *dum=(char*)malloc(16*sizeof(char)); 

    if (dum==NULL){ 
     printf("Memory could not be allocated \n"); 
    } 
    else { 
     printf("Memory was allocated – remember to free\n \n"); 

     *i1=1; 

     fputs("Input filename = ", stdout); 
     fflush(stdout); 
     fgets(input,sizeof(input),stdin); 

     printf("Filename = \"%s\"\n",input); 

     return i1; 

    } 
} 

所以在如果你返回「I1」,這是一個int指針,這絕對不是一個字符指針的一條路徑。

在另一半,你只是直到功能的結束,它不返回任何東西。

你很幸運,你的編譯器警告你這件事。很多,默認情況下,忽略它。另外,你有內存泄漏。你的dum的malloc內存,但從來沒有釋放它。

相關問題