2017-08-08 79 views
-5

我有一個函數返回一個指針,我正在計算給定數字的階乘。如何以C語言返回指針

這是框架代碼,我不能改變

#include<stdio.h> 
#include<string.h> 
//Read only region start 

char* factorial (int input1) 
{ 

    //Read only region end 
    //Write code here 


} 

我寫的代碼是:

enter image description here

我嘗試這個代碼太

#include<stdio.h> 
#include<string.h> 
//Read only region start 

char* factorial (int input1) 
{ 

    //Read only region end 
    //Write code here 
    char fact=1; 
    while(input1!=0) 
    { 
     fact = fact * input1; 
     input1--; 
    } 
    return fact; 

} 

左邊說了問題和右側是我寫的代碼。 它拋出的錯誤是「段錯誤

enter image description here

該方案不需要main()功能導致其東西mettl使用在後臺調用函數和評估結果。

+9

'char * fact = 1;'聲明一個指針並將指針(地址)設置爲1,而不是發佈代碼的圖片,請直接複製粘貼到您的問題 – litelite

+0

好吧,給我一分鐘 –

+1

'由於您試圖訪問內存中的地址「1」,因此對「* fact + input」的引用將成爲段錯誤。你需要分配一個有效的地址來放入'fact',然後你可以正確引用它。 – lurker

回答

1

我修改你的代碼,這裏是它的正確的版本:

unsigned int factorial (int input1) 
{ 
    unsigned int res = 1; 

    while(input1 > 1) { 
    res = res * input1; 
    input1--; 
    } 
    return res; 
} 

你的錯誤是返回一個指針,而不是(char *)一個簡單的字符(一個字節的值)。

我也將char更改爲unsigned int。爲什麼?

  1. unsigned:因爲它似乎是你希望你的結果是積極的,否則與input1--你的循環將無法正常工作。因此,無符號數允許您在遇到數據類型限制之前擁有更大的結果集(對於已簽名的字符,最大值爲127,對於無符號字符則最大值爲255)。

  2. int:因爲在幕後(在彙編代碼中),傳遞到堆棧和進入CPU寄存器的數據的大小是int。 ASM指令指示只使用寄存器的一個字節(在4或8個字節之間,取決於x32或x64)。但是,無論使用字節而不是int,性能都沒有提高。那麼,爲什麼不使用一個int,如果它可以覆蓋更多的結果呢? :-)

  3. 我也停止了> 1條件的循環,因爲再次運行一次迭代只是做一個x1乘法是沒用的。這是一個真正的壞蛋優化...笑話 ;-))


UPDATE:

根據您的意見,你不能改變的函數定義,所以這個代碼將結果反饋爲字符串工作( char *):

char* factorial (int input1) 
{ 
    unsigned int res = 1; 
    char *str; 

    while(input1 > 1) { 
    res = res * input1; 
    input1--; 
    } 
    str = malloc(32); 
    sprintf(str, "%u", res); 
    return str; 
} 

請注意,它分配一個緩衝區來存儲結果(32應該是即使在64位...)。您可能想要在使用後緩衝區free()以避免內存泄漏。

+1

老兄我無法改變這個「char * factorial(int input1)」,它是從平臺提供商進行預編譯的。 –

+0

我相應地更新了我的答案。 – Fabien

+0

C中根本沒有「字節」的乘法運算。在乘法之前,所有少級的操作數都被提升爲「int」或「unsigned int」。 –