2011-11-01 60 views
-2

這是我可以使用宏而不是遞歸來避免segmantion錯誤嗎?

How can i remove this Segmentation fault in C Program

這裏由於遞歸分段故障發生,因爲堆棧溢出的擴展問題,所以曼尼次

,所以我已經改變了他的代碼,這樣的..

做一個MACRO的功能,因此功能呼叫被刪除

#include <stdio.h> 

static inline void p(char *a, int b); 


#define MAGIC(a,b) p(a,b) 

void p(char *a, int b) 
{ 
    static long int i = 0; 

    if (i != 350000) 
    { 
     printf("\n%ld \t at Hi hello", i); 
     i++; 
     return MAGIC(a, b); 
    } else 
    { 
     return; 
    } 
} 


int main() 
{ 
    char *a = "HI"; 
    int b = 10; 
    MAGIC(a, b); 
    printf("\nComplete"); 
    return 0; 

} 

仍然我得到分段錯誤...仍然堆棧溢出....爲什麼?

+0

你到底要計劃做什麼,爲什麼?爲什麼不使用循環? –

回答

2

變化return MAGIC(a, b);

goto START;和函數的開頭加上START標籤。

編輯:使用while循環

示例:使用for循環

void p(char *a, int b) 
{ 
    static long int i = 0; 

    while (i != 350000) 
    { 
     printf("\n%ld \t at Hi hello", i); 
     i++; 
    } 
} 

例子:

void p(char *a, int b) 
{ 
    long int i = 0; // static seems wrong here 

    for (;i != 350000; i++) 
    { 
     printf("\n%ld \t at Hi hello", i); 
    } 
} 
+0

HEY MAN它的工作..但是goto對嵌入很危險系統? –

+0

如果(ab)使用不正確,'goto'只是危險的。所有循環都只是'goto'的語法糖。你可以重寫你的代碼來使用'while'或'for'循環來使它更「漂亮」。 – leppie

2

不,它不會工作。宏只是一個文本複製粘貼,所以結果仍然是一樣的。

所以,你的代碼將被擴展爲:

void p(char *a, int b) 
{ 
    static long int i = 0; 

    if (i != 350000) 
    { 
     printf("\n%ld \t at Hi hello", i); 
     i++; 
     return p(a, b); 
    } else 
    { 
     return; 
    } 
} 


int main() 
{ 
    char *a = "HI"; 
    int b = 10; 
    p(a, b); 
    printf("\nComplete"); 
    return 0; 

} 

其仍具有遞歸和將可能計算器。

編輯:重新設計算法的一種方法如下:

void p(char *a, int b) 
{ 
    long int i = 0; 

    while (i != 350000) 
    { 
     printf("\n%ld \t at Hi hello", i); 
     i++; 
    } 
} 
+0

雅我avaoiding函數調用..我只是複製功能代碼到宏..所以不使用堆棧 –

+2

@ Mr.32:以上的理解是非常不正確的。 – leppie

+0

那麼我如何使用宏來調用函數?可能嗎 ? –

相關問題