2016-10-26 2 views
1

私はCの新人です。mallocとフリーでいくつか問題があります。問題がどこにあるのか分かりません。私はここでC mallocとfreeは動作しません。

==13518==  in use at exit: 0 bytes in 0 blocks 
==13518== total heap usage: 0 allocs, 0 frees, 0 bytes allocated 
==13518== 
==13518== All heap blocks were freed -- no leaks are possible 
==13518== 
==13518== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 0 from 0) 
==13518== 
==13518== 1 errors in context 1 of 1: 
==13518== Invalid read of size 1 
==13518== at 0x40D2DFB: ____strtol_l_internal (in /usr/lib/libc-2.23.so) 
==13518== by 0x40D2C68: strtol (in /usr/lib/libc-2.23.so) 
==13518== by 0x40CFAFF: atoi (in /usr/lib/libc-2.23.so) 
==13518== by 0x80487B0: main (in /media/test/prime) 
==13518== Address 0x0 is not stack'd, malloc'd or (recently) free'd 
==13518== 
==13518== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 0 from 0) 

私はmain.cのはvalgrindの中で自由に呼び出したとき、私は私の配列のためのmallocの割り当てを使用してprime.cとmain.cの

とプログラムが私にこのエラーが表示さ

を持っている私の2クラスである

prime.c

#include <stdio.h> 
#include <stdlib.h> 
#include "prime.h" 
#include <stdint.h> 
#include <stdbool.h> 
#include <math.h> 
#include <string.h> 
#include <unistd.h> 

uint64_t* findPrime(uint64_t max ,size_t* primeCount) 
{ 

    int cnt=0; 
    uint64_t *array; 
    array = (uint64_t *) malloc(max * sizeof(uint64_t)); 


    if(array ==NULL) 
    { 

    return (uint64_t*) 1; 
    } 


for(int i =2; i < max;i++) 
    { 
    array[i] = i; 
    } 

for(int i = 2;i <= sqrt(max);i++) 
    { 

    if(array[i] != 0) 
    { 

for(int j = (i*i); j< max; j =j+i) 
     { 
    array[j] = 0; 
     } 
    } 
    } 

for(int i =2; i <max; i++) 
    { 
     if(array[i]) 
     { 
     cnt++; 
     } 
    } 

    *primeCount = cnt; 
return array; 
} 

main.cの

#include <stdio.h> 
#include <stdlib.h> 
#include "prime.h" 
#include <string.h> 

int main(int argc, char* argv[]){ 

    int len = argc-1; 
    int limit = atoi(argv[1]); 
    int ret =1; 
    size_t pc =0; 


    if(len == 1) 
    { 
    limit = atoi(argv[1]); 
    } 
    else if(len == 2) 
    { 
    limit = atoi(argv[2]); 
    ret = strcmp(argv[1],"-p"); 

    if(ret != 0) 
    { 
    printf("Invalid input!\n"); 
    return 1; 
    } 
    } 
    else 
    { 
    printf("Wrong number of arguments!!!\n"); 
    return 1;  
    } 

    uint64_t* primes = findPrime(limit, &pc); 
     printf("Total number of primes %zu \n", pc); 

    if(ret == 0) 
    { 
     for(int i =2; i < limit;i++) 
     { 
     if(primes[i] != 0) 
     { 
      printf("primess: %lld \n", primes[i]); 
     }  
     } 
    } 
    free(primes); 
    } 
+4

AFAIK、Cにはクラスがありません。 –

+1

['malloc()'と 'C 'のファミリの戻り値をキャストしない理由についてのこのディスカッションを参照してください。](http://stackoverflow.com/q/605845/2173917)。 –

+6

'if(配列== NULL) { return(uint64_t *)1; } 'は魚です... –

答えて

2

valgrind出力のスタックトレースは、atoi()への3回の呼び出しの1つにエラーを指定します。これはmain()です。特定の問題は、nullポインタがその関数に渡されたことにあります。各atoi()呼び出しの引数はargv配列の要素なので、動的メモリ割り当てではなく、プログラム引数の処理で問題が発生します。問題はここでなければならないように見えます

int limit = atoi(argv[1]); 

あなたは無条件にそのatoi()呼び出しを実行しますが、argcが2未満であるとき、それは未定義の動作を示します。

関連する問題