void-pointers相关内容
好吧,我最初把这个问题的表述搞砸了(自从我认真编写 C++ 代码以来已经一年多了,而且我对纯 C 的经验非常有限),所以让我们再试一次. 编写一些 C 代码是为了期望您执行以下操作 void* p;create_new_thing(&p);//p 现在是一个新事物do_stuff_to_thing(p);//p发生了什么事 我的问题是如何在 Julia 中创建对象 p.现在我相信答案是
..
以下 C 代码段: [...]无效 f1(无效* a){printf("f(a) 地址 = %p \n",a);a = (void*)(int*)malloc(sizeof(int));printf("地址 = %p \n",a);*(int*)a = 3;printf("数据 = %d\n",*(int*)a);}无效 f(无效){无效* a1=NULL;printf("a1 地址 = %p
..
我有以下 c 代码: #include #include 无效 *func(int a) {如果(a==3){int a_int = 5;int *ptr_int = &a_int;返回(无效*)ptr_int;}否则如果(a==4){字符 a_char = 'b';字符 *ptr_char = &a_char;返回(无效*)ptr_char;}别的 {fp
..
如何以单字节精度便携地执行指针运算? 请记住: char 在所有平台上都不是 1 字节 sizeof(void) == 1 仅在 GCC 中作为扩展提供 虽然某些平台可能有指针 deref 指针对齐限制,但算术可能仍需要比最小基本 POD 类型的大小更精细的粒度 解决方案 您的假设是有缺陷的 - sizeof(char) 被定义 为 1. 来自 C99 标准 (TC3
..
我有一个小问题:如何找出 C++ 指针的类型? 我经常在我的控制台程序中使用一个小函数来收集输入,它看起来像这样: void query(string what-to-ask, [insert datatype here] * input) 我想创建一个通用表单,使用一个空指针,但我不能创建一个空指针,那么我如何找出它的类型以便我可以转换它? 解决方案 你不能. 然而,一种
..
我多次看到并使用了C++,特别是在各种线程实现中.我想知道这样做是否有任何陷阱/问题?当我们强制转换为 void* 并再次返回时,有什么方法可能会遇到错误或未定义的条件吗?如果有这些问题,我们应该如何解决? 谢谢. 解决方案 我想知道这样做是否有任何陷阱/问题? 在将 void* 转换回特定类型时,您需要绝对确定,否则,您最终会遇到 未定义行为 和潜在的灾难.一旦你使用vo
..
我有一个 C++ 程序: 结构参数{输入 a, b, c;参数():a(3),b(6),c(9){}};类 test_class{上市:void *member_func(void *args){参数 vars = (参数 *) (*args);//错误:void不是一个//指向对象类型的指针std::cout
..
我的程序需要使用void*来在动态调用的情况下传输数据或对象,以便它可以引用任意类型的数据,甚至是原始类型的数据.但是,我最近发现在具有多个基类的类的情况下向下转换这些 void* 的过程失败,甚至在调用这些向下转换的指针上的方法后使我的程序崩溃,即使内存地址似乎是正确的.崩溃发生在访问“vtable"期间. 所以我创建了一个小测试用例,环境是Mac OS X上的gcc 4.2: 类形状{
..
在 C 中使用线程时,我面临警告 “警告:从不同大小的整数转换为指针" 代码如下 #include#include#include#include无效*打印(无效*id){int a=10;printf("我的线程id是%ld\n",pthread_self());printf("线程 %d 正在执行\n",id);返回(空*)42;}int main(){pthread_t th[
..
我正在读一本书,我发现不应该直接使用 reinterpret_cast,而是将转换为 void* 与 static_cast 结合使用: T1 * p1=...无效 *pv=p1;T2*p2=static_cast(pv); 代替: T1 * p1=...T2*p2=reinterpret_cast(p1); 然而,我找不到解释为什么这比直接演员更好.如果有人能给我一个解释或指出我的答案,
..
我有一个原型为 void* myFcn(void* arg) 的函数,它用作 pthread 的起点.我需要将参数转换为 int 以备后用: int x = (int)arg; 编译器(GCC 4.2.4 版)返回错误: file.cpp:233: 错误:从“void*"转换为“int"失去精度 投射这个的正确方法是什么? 解决方案 您可以将其转换为 intptr_t 类型.它是一
..
在 Visual Studio C++ 版本 9(可能还有其他版本)中,以下代码: int a = sizeof(void);void const *b = static_cast("hello world");b += 6; 生成这些 错误: error C2070: 'void': 非法的操作数大小错误 C2036:“const void *":未知大小 此代码在 GCC 下工作,它处
..
它是pthread_create()中的参数.我认为每个部分的意思是: void *:返回值是一个void指针. (*):它是一个函数指针. (void *):它接受一个无类型指针作为参数. 正确吗? 解决方案 是,它是一个无名函数指针的签名,它接受并返回void *. 如果它有一个名字(如在一个变量中)它会是: void *(*myFuncName)(vo
..
我今天刚看到一张图片,我想我会很感激的解释.所以这是图片: 我发现这令人困惑,并想知道这些代码是否实用.我用谷歌搜索了这张图片,并在 this reddit 条目中找到了另一张图片,这是那张照片: 所以这种“螺旋式阅读"是有效的吗?这是 C 编译器的解析方式吗? 如果对这个奇怪的代码有更简单的解释,那就太好了. 除此之外,这些代码有用吗?如果有,在何时何地? 有一个一个问题
..
id 和 void * 有什么区别? 解决方案 void * 的意思是“对一些随机内存块的引用,其中包含无类型/未知内容" id 表示“对未知类的某个随机 Objective-C 对象的引用" 还有其他语义差异: 在 GC Only 或 GC Supported 模式下,编译器将为 id 类型的引用发出写屏障,但不会为 void * 类型的引用发出写屏障.在声明结构时,这
..
当一个指向特定类型(比如 int, char, float, ..)的指针增加时,它的值增加该数据类型的大小.如果指向x 大小数据的void 指针递增,它如何指向x 字节前面?编译器如何知道将 x 添加到指针的值? 解决方案 最终结论:void* 上的算术在 C 和 C++ 中都是非法. GCC 允许它作为扩展,参见 算术上void- 和函数指针(注意本节是手册“C 扩展"一章的一部
..
我正在尝试将 void** 指针转换为 C 中的 int** 2D 数组 这是我尝试使用的代码(删除了所有无关位): \*假设我有一个名为 graph 的数据结构,其中包含一些*其中的元素“void** graph"和一些元素“int order"*/void initialise_graph_data(graph_t *graph){无效**graph_data = NULL;int (
..
使用 intptr_t 作为通用存储(保存指针和整数值)而不是 void* 是个好主意吗?(如下所示:http://www.crystalspace3d.org/docs/online/manual/Api1_005f0-64_002dBit-Portability-Changes.html) 对于我已经阅读的内容: int -> void* -> int 往返不保证保持原始值;我猜
..
使用 intptr_t 作为通用存储(保存指针和整数值)而不是 void* 是个好主意吗?(如下所示:http://www.crystalspace3d.org/docs/online/manual/Api1_005f0-64_002dBit-Portability-Changes.html) 对于我已经阅读的内容: int -> void* -> int 往返不保证保持原始值;我猜
..
以下 C 代码片段: [...]void f1(void* a){printf("f(a) 地址 = %p \n",a);a = (void*)(int*)malloc(sizeof(int));printf("一个地址 = %p \n",a);*(int*)a = 3;printf("数据 = %d\n",*(int*)a);}无效f(无效){void* a1=NULL;printf("a1
..