为什么我不能从int star到void star而不是int64_t star?

时间:2016-07-16 20:07:36

标签: c++

我有以下代码,在运行时生成垃圾值输出:

#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

但是,当我在main中将类型从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。 这是不是由于指针?

1 个答案:

答案 0 :(得分:2)

将指针强制转换为其他类型不会更改原始指针指向的值。您只能安全地转换值而不是指针。

当您看到您的演员要从索引int读取其他x[1]值并将其显示为int64_t时。

不要在你的函数中强制转换指针 - 强制转换值然后它就可以了。