jw_lee

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

函数需要一个子函数找出指定数值以内的质数,一开始在main里声明指针,子函数类型设为返回局部指针,程序正常运行,但有warning: function returns address of local variable。

//Pointers on C exercise 6.4
//date 2013/8/13
//1000以内的质数
#include<stdio.h>
#define TURE 1
#define FALSE 0

int *eratosthenes( int upmost );

int main(){
    int const up = 1000;
    int i = 0;
    int *test;
    test = eratosthenes( up );
    for( i = 0; i < up; i++ ){
        if( test[ i ] == TURE ){
            printf( "%d\n", i );
        }
    }
    return 0;
}

int *eratosthenes( int const upmost ){
    int i = 0;
    int j = 0;
    int testlist[ upmost ];
    testlist[ 0 ] = FALSE;
    testlist[ 1 ] = FALSE;
    for( i = 2; i < upmost; i++ ){
        testlist[ i ] = TURE;
    }
    for( i = 2; i < upmost; i++ ){
        if( testlist[ i ] == TURE ){
            for( j = i + i; j < upmost; j = j + i){
                testlist[ j ] = FALSE;
            }
        }
    }
    return testlist;
}

将子函数里数组声明改成

extern int testlist[ upmost ];

E:\programming pearls\6.4\6.4.c|26|error: object with variably modified type must have no linkage|

E:\programming pearls\6.4\6.4.c|26|error: storage size of 'testlist' isn't constant|

E:\programming pearls\6.4\6.4.c|26|warning: unused variable 'testlist' [-Wunused-variable]|

static int testlist[ upmost ];

E:\programming pearls\6.4\6.4.c|26|error: storage size of 'testlist' isn't constant|

E:\programming pearls\6.4\6.4.c|26|warning: unused variable 'testlist' [-Wunused-variable]|

 

最后解决办法是将数组作为参数传递给函数

//Pointers on C exercise 6.4
//date 2013/8/13
//1000以内的质数
#include<stdio.h>
#define TURE 1
#define FALSE 0

void eratosthenes( int upmost , int *testlist );

int main(){
    int const up = 1000;
    int i = 0;
    int test[ up ];
    eratosthenes( up, test );
    for( i = 0; i < up; i++ ){
        if( test[ i ] == TURE ){
            printf( "%d\n", i );
        }
    }
    return 0;
}

void eratosthenes( int const upmost, int *testlist ){
    int i = 0;
    int j = 0;
//    int testlist[ upmost ];
    *testlist = FALSE;
    *( testlist + 1 )= FALSE;
    for( i = 2; i < upmost; i++ ){
        *( testlist + i  ) = TURE;
    }
    for( i = 2; i < upmost; i++ ){
        if( *( testlist + i  ) == TURE ){
            for( j = i + i; j < upmost; j = j + i){
                *( testlist + j  ) = FALSE;
            }
        }
    }
 //   return testlist;
}

 

posted on 2013-08-13 17:08  jw_lee  阅读(609)  评论(0编辑  收藏  举报