2017-03-18 5 views
0

にIは、関数intToBitsによってビットの配列に文字を変換するために、次のコードを作った:C:チャービットとプリント

typedef unsigned char poly8; 
typedef unsigned long long poly8x64[8]; 

char* intToBits(unsigned k) { 
    int i; 
    char *nk = malloc(8); 
    for(i=7;i>=0;i--){   
     nk[i] = (k%2);   
     k = (int)(k/2); 
     printf("nk= %d \n", nk[i]); 
    } 
    return *nk; 
} 

void poly8_bitslice(poly8x64 r, const poly8 x[64]) 
{ 
    //TODO 
    int i; 
    for(i=0;i<64;i++) 
    { 
     printf("x= %d \n", x[i]); 
     char* mem = intToBits(x[i]); 
     printf("bufer= %d \n", *mem);; 
    } 
} 

int main() 
{ 

    poly8 a[64], b[64], r[64]; 
    poly8x64 va, vb, vt; 
    int i; 

    FILE *urandom = fopen("/dev/urandom","r"); 
    for(i=0;i<64;i++) 
    { 
    a[i] = fgetc(urandom); 
    b[i] = fgetc(urandom); 
    } 

    poly8_bitslice(va, a); 
    poly8_bitslice(vb, b); 

    fclose(urandom); 
    return 0; 
} 

しかし、私はセグメンテーションfailtエラーを取得してい印刷中。私は何をすべきか分からない。ポインタが間違っていますか? intToBitsの結果を出力したいだけです。

+1

あなたはbytes'ない 'bits'が...配列のtypedef使用 –

+0

は、IMO、 – Jerfov2

+0

真ひどいアイデアですが、'割り当てるセグメンテーションフォールト – Ceesz

答えて

2

犯人はintToBitsにこの行です:

return *nk; 

それは代わりにあなたがコンパイラの警告をオンにした場合、コンパイラはを知らせるでしょうchar*charを返します。

変更し、それに:

return nk; 
+0

記録のために、私はその行のための "gcc"警告は、 "警告:戻り値はキャストのない整数からポインタを作る" ... "整数"は '* nk'の' char'値です。 –