首页 > 解决方案 > 将模板指针转换为 char 指针时 C++ 不执行代码

问题描述

Cygwin 3.2.0
cmake 3。

您好,我是 C++ 新手(昨天才开始),所以我对指针并不完全熟悉。据我了解,指针只是内存中某物的第一个索引的位置,编译器会在增量时自动将指针地址缩放到它所指向的任何内容。从下面的代码和输出来看,这是 Cywgin 编译器中的错误还是我使用的指针错误?(除了下面显示的之外没有 try/catch 语句来捕获异常)。

该方法_put是从方法中调用的write,其类V与写泛型相同。在下面的代码中,我试图执行_put<short>(2). 我期望程序要么抛出异常,要么打印"From DLL\nWorking from DLL"并返回1。在这种情况下,这两种情况都没有发生,这让我对为什么 put 方法代码的第二部分没有正确执行以弄清楚发生了什么感到困惑。

//Code buried in a shared library (.dll)
//Trial 1 Code
template<class V>
void _put(long long index, V v){
    std::cout << std::endl << "From DLL";
    //void* t = (void*) v; //Works
    char* t = (char*) v; //Fails
    std::cout << std::endl << "Working from DLL?" << t;
}

//Code buried in a shared library (.dll)
//Trial 2 Code
template<class V>
void _put(long long index, V v){
    std::cout << std::endl << "From DLL";
    void* t = (void*) v; //Works
    //char* t = (char*) v; //Fails
    std::cout << std::endl << "Working from DLL?" << t;
}
//Exe code using the shared library
int main() {
    std::cout << "From Exe";
    try {
        Memory m(2000);
        m.write<short>(2);
        std::cout << m.get<char>() << "Test";
        return 1;
    }catch(const std::exception& ex){
        std::cerr << "Error : " << ex.what() << std::endl;
        throw;
    }
}

试验 1 代码的输出:

From Exe 
From DLL
Process finished with exit code 0

试验 2 代码的输出:

From Exe
From DLL
Working from DLL?0x2 Test
Process finished with exit code 1

标签: c++cygwin

解决方案


如果你要这样做:

char* t = (char*) v;
std::cout << std::endl << "Working from DLL?" << t;

然后v需要指向一个有效的(C 风格)字符串,而且很可能不是。

如果您打算打印t为原始地址,那么您可以执行以下操作:

std::cout << std::endl << "Working from DLL?" << (void *) t;

推荐阅读