2016-07-16 10 views
-2

私が実行したときにジャンク値出力を生成し、次のコードを、持っている:int starからvoid starへ、そしてint64_t starからtypecastできないのはなぜですか?

#include <iostream> 
#include <cstdlib> 
#include <stdio.h> 

using namespace std; 
void printer(void* x, int length, int y){ 
    if(y == 0){ 
     int64_t* z = (int64_t*) x; 
     for(int i=0;i<length;i++){ 
      printf("%ld\n", z[i]); 
     } 
    } 
} 
int main(){ 
    int length = 4; 
    int* x = (int*) malloc(length * sizeof(int)); 
    int y = 0; 
    x[0] = 1; 
    x[1] = 4; 
    x[2] = 1; 
    x[3] = 4; 
    printer(x, length, y); 
} 

Output: 
17179869185 
17179869185 
0 
132049 

をしかし、私がメインでintからint64_tにタイプを変更すると、それが正常に動作しますが:

#include <iostream> 
#include <cstdlib> 
#include <stdio.h> 

using namespace std; 
void printer(void* x, int length, int y){ 
    if(y == 0){ 
     int64_t* z = (int64_t*) x; 
     for(int i=0;i<length;i++){ 
      printf("%ld\n", z[i]); 
     } 
    } 
} 
int main(){ 
    int length = 4; 
    int64_t* x = (int64_t*) malloc(length * sizeof(int64_t)); 
    int y = 0; 
    x[0] = 1; 
    x[1] = 4; 
    x[2] = 1; 
    x[3] = 4; 
    printer(x, length, y); 
} 

Output: 
1 
4 
1 
4 

のはなぜですこの? intint64_tの間の変換がうまくいるようです:How do you convert int into int64_t これは何とかポインタが原因ですか?

+0

アレイから2つの 'int'を一度に出力しています(これは、' int64t'の値が高い--'17179869185 = 1 + 4 * 2^32'です)、後半は範囲外です。あなたは何を期待しましたか、何をしたいですか? – LogicStuff

+0

申し訳ありませんが、一度に2つの値をどのくらい正確に表示していますか? – Alex

+0

'int'は32ビット以下であり、' int64_t'は64であり、配列要素は連続して格納されます... – LogicStuff

答えて

2

ポインタを別の型にキャストしても、元のポインタが指している値は変更されません。値はキャストできますが、ポインタはキャストできません。

あなたのキャスト軍は、他のintの値をインデックスx[1]から読み取って、int64_tと表示します。

関数にポインタをキャストしないでください。値をキャストしてから機能します。

関連する問題