C和C ++中的void指针(void *)是一个指向没有指定类型的内存位置的指针。
当我尝试使用 K & R 代码示例对整数数组进行排序时,为什么会收到 SEGFAULT?
我正在尝试阅读《C 编程语言,第二版》,但我无法完全理解以下代码中发生的情况。 书中的例子效果很好......
这可以编译(尽管是 UB (对吧?)因为 fvp == nullptr) 整数 f; 无效* fvp{}; decltype(f)* fp = static_cast(fvp); 但这不能 无效 f() {} 无效* fvp{}; decltyp...
好吧,这让我感到非常困惑。我只是不知道这个作业有什么问题: 无效*pa;无效*pb; 字符*ptemp;字符 *ptemp2; ptemp = (char *)pa; ptemp2 = (char *)pb; 可以...
如何修复 clang-tidy 中的“多级隐式指针转换”警告?
我有一些遗留代码,如下所示: bool has_attribute(int kvidx) const { void* v = nullptr; int 标志 = 0; MPI_Comm_get_attr(impl_, kvidx, &v, &flag); 返回标志...
我正在从另一个人那里接管代码。我发现了一种对我来说似乎很奇怪的编码模式。这是针对嵌入式 32 位 PIC 处理器(如果相关的话)。 他们的标题中有一个自定义的 typedef...
为了学习的目的,我最近查看了一个使用 Win32 WriteFile 的现有程序集(使用 Reflector)。其实现是: Write(IntPtr handleFile, void* bufferData, uint 长度){ 维...
在 C 中,memcpy() 不需要/不建议强制转换为 (void*),就像 malloc() 不需要一样?
我对从以下网站读到的有关 memcpy()(和 malloc())的内容感到有些困惑: http://www.cplusplus.com/reference/cstring/memcpy/ 在该页面中,以下两行显然是...
我不明白下面的神秘会员是什么属性: typedef 结构体_myobject { 长号码; 无效*神秘; } t_myobject; 这个void *成员是一个什么样的成员呢?多少钱
我正在尝试开发一种自定义strcpy的方法。我考虑了两种实现方法。一种方法涉及使用 memcpy,而另一种方法涉及增加指针和
我正在查看用 C++ 编写的 API,我对以下参数类型的含义感到困惑: 无效*&*数据 这是否意味着用户将传递对 void 指针的引用?如果...
通过 Fortran 中的 C void* 传递和检索任意数据
对于这么长的消息,我提前表示歉意。 我正在寻求专业知识,以确定我正在做的事情是否安全/正确,或者是否存在替代方案。 我有一个可以容纳用户的 C 库-
我正在研究 C 语言中的指针。尝试了很多方法来确保我理解指针是如何工作的,但我发现了一些我不理解的东西。这是有问题的代码片段: 整数 b = 30;
我需要用C语言创建几种数据结构之一的实例(例如:DynamicArray、BST、HashMap、Trie)。从文件中读取的数据结构的名称,然后是数据类型的实例...
我必须在c中实现动态数组。这是它的结构: typedef void (*PrintArrayElement)(const void* element); 类型定义结构{ size_t 尺寸; size_t 容量; 无效**数组;
我正在编写一个 C 程序,根据环境变量对数组应用不同类型的量化。 问题是,我需要使用相同的函数 void foo(void* ptr, qu...
我希望实现类似的东西 int memcmp ( const void * ptr1, const void * ptr2, size_t num ); 但要区分两种情况 (1) < and (2) =,> 而不是 我希望实现类似的东西 int memcmp ( const void * ptr1, const void * ptr2, size_t num ); 但要区分两种情况 (1) < and (2) =,> 而不是 (3)>。我的目标是减少使用的指令数量,假设在标准笔记本电脑(x86 架构)上运行。 问题的解决方案很可能就是#define less(a,b,n) (memcmp(a,b,n) < 0)。 使用 memcmp 有很多优点,因为编译器可能会高度优化它的使用。它可能会查看您用作输入的内容并相应地内联memcmp,从而给出最有效的代码。 例如,memcmp需要在内部将每个字节转换为unsigned char并处理未对齐的数据。但是,如果您在 x86_64 上提供两块 8 字节对齐的数据,则机器代码可能没有理由逐字节地咀嚼它。 这是一个例子,我将一个“less”函数的半天真版本拼凑在一起,其工作原理类似于memcmp: #include <string.h> #include <stdio.h> bool lesscmp (const void* obj1, const void* obj2, size_t size) { const unsigned char* o1 = (const unsigned char*)obj1; const unsigned char* o2 = (const unsigned char*)obj2; for(size_t i=0; i<size; i++) { if(o1[i] != o2[i]) { return o1[i] < o2[i]; } } return 0; } int main (void) { char s1[] = "This is some data"; char s2[] = "This is some other data"; printf("%d\n", memcmp(s1,s2,sizeof s1) < 0); printf("%d\n", memcmp(s2,s1,sizeof s1) < 0); printf("%d\n", memcmp(s1,s1,sizeof s1) < 0); printf("%d\n", lesscmp(s1,s2,sizeof s1)); printf("%d\n", lesscmp(s2,s1,sizeof s1)); printf("%d\n", lesscmp(s1,s1,sizeof s1)); } 在实现它时,我很快就意识到了一个问题:虽然我们正在寻找 < 结果,但我们必须在字节相等的情况下继续循环。当它们不存在时,我们就可以开始寻找 <,但需要进行额外的比较。 因为 C 没有像“use <= but store the less or equal statuses separately, so we can loop based on the equal flag but return the less flag". On the assembler level we can likely do that however, making this function a good candidate for inline assembler in case we care deeply about performance. And yet unless we happen to be some x86 assembler guru, we can probably not hope to beat the compiler even with hand-crafted assembler. 查看Compiler Explorer中生成的代码(gcc -O3 x86),我们可以得出结论,我自制的函数一团糟: lesscmp: test rdx, rdx je .L5 xor eax, eax jmp .L4 .L3: add rax, 1 cmp rdx, rax je .L5 .L4: movzx ecx, BYTE PTR [rsi+rax] cmp BYTE PTR [rdi+rax], cl je .L3 setb al ret .L5: xor eax, eax ret cmp到处都是——它的树枝比圣诞树还多!这根本不会表现得很好。 而等效的 memcmp 调用有时是内联的,导致各种奇特的 x86 内在函数、硬编码的“幻数”等以及很少的分支(如果有的话)。效率更高。 因此,结论是“过早的优化”仍然是万恶之源,而无论目标如何,memcmp(...) < 0都可能是实现此目的的最佳解决方案。
我假设以下函数可以获取任何数据类型,例如 float、double、long 和 long long 并返回正确答案。不幸的是,事实并非如此。谁能解释为什么?我的目标是...
我希望实现类似的东西 int memcmp ( const void * ptr1, const void * ptr2, size_t num ); 但要区分两种情况 (1) < and (2) =,> 而不是 3
有没有一种解决方法可以将函数指针类型转换为 C 中的对象指针?
我有一个名为“bench”的函数,它接受一个返回 void 指针的函数指针(对于泛型)。 静态内联无符号长凳(void* (*funcPtr)(va_list), ...) 但如果我通过了...