c++ - 将模板指针转换为 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
解决方案
如果你要这样做:
char* t = (char*) v;
std::cout << std::endl << "Working from DLL?" << t;
然后v
需要指向一个有效的(C 风格)字符串,而且很可能不是。
如果您打算打印t
为原始地址,那么您可以执行以下操作:
std::cout << std::endl << "Working from DLL?" << (void *) t;
推荐阅读
- directory - 仅复制文件夹
- reactjs - 如何将 .map 抽象到其他 React 组件以列出 API 调用
- java - 具有自定义域名的 Wiremock/Mockserver?
- javascript - Jquery x-editable 不起作用 - Laravel 6.x
- aws-lambda - Lambda 函数中的 sessionId 可以是 Alexa 技能的 ID?
- css - 无法完全覆盖 MUI TableCell 中的顶部和底部填充以使整个单元格内容可点击
- reactjs - 单元测试反应动作创建者 thunk
- python - 创建管理对象列表的python类以及如何包含在UML图中的最佳实践
- python - Django 计算字段 Save()
- javascript - 使用 Oruga 和 Vue3 时缺少模板或渲染功能