2015-12-17 22 views
0

有人可以告诉我这段代码有什么问题吗?为什么这段代码不起作用?它涉及指针和函数的使用c

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

char * prime(int N); 

int main() 
{ 

    char* p = prime(13); 
    printf("%s", p); 
    return 0; 
} 

char * prime(int N) 
{ 
    int i,j=1; 
    char yes[] = "Number is a prime"; 
    char no[] = "Number is not a prime"; 

    for(i=2; i<=N-1; i++) 
    { 
     if(N%i == 0) 
      j=0; 
    } 

    if(j == 1) 
     return yes ; 
    else 
     return no ; 
} 

预计产量=所示

Number is a prime

输出=

[email protected]

+3

在C.你千万不要返回局部指针/数组值这些变量超出范围时,函数退出和存储它指向的是不再有效。 – kaylum

+2

用'* yes'替换'yes []',用'* no'替换'no []',你的代码就可以正常工作。另一种解决方案是摆脱“yes”和“no”变量,并返回字符串,例如'返回'数字是素数';' – user3386109

+0

@ user3386109如何返回一个字符串?以及第一种方法如何工作?我们如何向指针变量提供字符串? –

回答

4

您使用它指向你不拥有的内存指针回读数据;这样做的行为是undefined

yesno仅在函数prime中定义。

一旦函数退出,指针是悬空

考虑在全球范围内写const char* yes = "Number is a prime";等,改变prime返回一个int其中1表示素性和0没有,并使用该返回值main输出相关的字符串。这不仅会解决您的错误,但由于prime应该不是很在乎它是一个不错的设计它的输出值是如何消费:这是一个的关注呈现结果另一个函数的工作。您的素数测试也可以进行优化:特别是,您只需要达到N的平方根。

请注意我如何使用const char*来表示数据保存在只读内存中。

+0

如果我们可以给函数一个地址作为参数,那么为什么我们不能从函数返回一个地址?不是两个过程都相反吗? –

+1

你可以从一个函数返回一个地址 - 你只是不能明智地返回一个局部变量的地址,当你的函数返回时它将不再存在。 –

相关问题