2011-11-01 79 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

那么我如何使用宏来调用函数?可能吗 ? –

相关问题