我有函数,它接收指向数组的指针和指向函数的指针,并应返回由参数传递的函数定义的新数组.我的问题是如何将一个数组的元素复制到另一个数组而不知道它的类型
void * scrambleArr(void * arr, int numElem, int elemSize, int (*func)(void*)) {
void * newArr;
int cPos, newPos,i;
newArr = (void *)malloc(numElem*elemSize);
for (i=0 ; i < numElem ; i++)
{
cPos = i*elemSize;
newPos = func((char*)arr+cPos);
*((char*)newArr+newPos) = *((char*)arr+cPos);
}
return newArr;
}
Run Code Online (Sandbox Code Playgroud)
传入最后一个参数的函数
int posArrayBySize(void *el) {
ARRAY* arr = (ARRAY *)el;
return arr->size - 1;
}
Run Code Online (Sandbox Code Playgroud)
主要代码:
int main( ) {
ARRAY * arrSorted;
int a[2] = {1,2};
int b[3] = {1,1,1};
int c[1] = {9}; …Run Code Online (Sandbox Code Playgroud) 从wincrypt api我收到一个指向char*的void*.这个char*指向char []的开头.我也收到一个void*指向一个大小为int的int char*.
关于pvData和cbData,我有以下来自Microsoft的文档.
pvData的数据类型:指向BYTE值数组的指针.此数组的大小在cbData参数中指定.返回以null结尾的Unicode字符串,其中包含证书的显示名称.
我希望将其转换void*为a,std::string但到目前为止,我输出的std::string是第一个字符.
我已阅读:转换一个void*到一个std ::字符串,但因为我void*是指向char*而不是std::string在static_cast中公认的答案失败,返回std::string*触发空指针异常.
到目前为止,我有以下内容:
// pvData = void* pointing to char*
// cbData = void* pointing to int*
std::string tempName;
tempName.assign(static_cast<char*>(pvData), static_cast<int*>(cbData));
printf("%S \n", pvData); // entire string is shown
printf("%s \n", tempName.c_str()); // only first character is shown
Run Code Online (Sandbox Code Playgroud)
我也试过了
tempName = static_cast<char*>(pvData); // only single character returned
tempName.assign(static_cast<char*>(pvData)); // only single character …Run Code Online (Sandbox Code Playgroud) 好吧,虽然堆栈上的详细信息void*,书籍喜欢The C Programming Language (K&R)和The C++ Programming Language (Stroustrup).我学到了什么?这void*是一个没有推断类型的通用指针.它需要强制转换为任何已定义的类型,并且打印void*只会产生地址.
还有什么我知道的? void*不能被解除引用,到目前为止仍然是C/C++我发现了很多关于但很少理解的一个项目.
我知道它必须是强制转换的,*(char*)void*但对我来说没有任何意义的generic指针是我必须知道我需要什么类型来获取值.我是一名Java程序员; 我理解泛型类型,但这是我挣扎的事情.
所以我写了一些代码
typedef struct node
{
void* data;
node* link;
}Node;
typedef struct list
{
Node* head;
}List;
Node* add_new(void* data, Node* link);
void show(Node* head);
Node* add_new(void* data, Node* link)
{
Node* newNode = new Node();
newNode->data = data;
newNode->link = link;
return newNode;
}
void show(Node* head)
{
while …Run Code Online (Sandbox Code Playgroud) 我有一个与三元条件运算符一起使用的void指针的问题.
的情况下:
int x = 5;
void * pointer = &x;
printf("x: %d \n", 1 == 1 ? (*((int*)pointer)) : (*((char*)pointer)));
Run Code Online (Sandbox Code Playgroud)
它写入控制台的数字5,whitch是正确的活动.但是当我将最后一行char更改为double时:
printf("x: %d \n", 1 == 1 ? (*((int*)pointer)) : (*((double*)pointer)));
Run Code Online (Sandbox Code Playgroud)
然后写0,我不知道为什么.我知道我可以使用if-else而不是它但我只是好奇它为什么这样工作.谁能帮助我?
我正在寻找我所做的练习,特别是一个“线程管理器”类,它通过将线程存储在“typedef void *HANDLE;”数组中来管理线程(真的吗?哈哈)在结构 GROUP 内声明。
所以我已经让它工作了,但我看到我正在通过“reinterpret_cast”转换为“std::thread*”来转换“HANDLE”,所以“void*”。
看到后我担心:如何以及如何将其直接转换为 std::thread 对象?
我做了这个代码,例如:
#include <iostream>
#include <thread>
typedef void *HANDLE;
class thread_obj {
public:
void operator()(int x){
for(int i = 0x0; i < x; i++){
std::cout << "i = " << i << std::endl;
}
}
};
int main(){
std::thread thr(thread_obj(), 0x3);
HANDLE test = &thr;
std::thread *p_thr = reinterpret_cast<std::thread*>(test);
p_thr->join();
return 0x0;
}
Run Code Online (Sandbox Code Playgroud)
这是原始代码。
如果我这样做:
std::thread p_thr = reinterpret_cast<std::thread&>(test);
Run Code Online (Sandbox Code Playgroud)
或者:
std::thread p_thr = *reinterpret_cast<std::thread*>(test);
Run Code Online (Sandbox Code Playgroud)
或者:
std::thread *temp = reinterpret_cast<std::thread*>(test);
std::thread p_thr = …Run Code Online (Sandbox Code Playgroud) 我很难完全理解和学习指针、强制转换和所有这些的行为。
我有以下结构,它基本上是一个stack data structure:
struct stack
{
void **items;
size_t top;
size_t max_size;
};
Run Code Online (Sandbox Code Playgroud)
我希望能够返回top element,所以这是我的Peek功能:
void *Peek(const stack_ty *stack)
{
return(stack->items[stack->top]);
}
Run Code Online (Sandbox Code Playgroud)
这是我的测试打印main.c:
stack_ty *new_stack = CreateStack(5);
Push(new_stack, (void *)1);
Push(new_stack, (void *)2);
Push(new_stack, (void *)3);
printf("The top element is %d\n", *(int *)Peek(new_stack));
Run Code Online (Sandbox Code Playgroud)
Segmentation fault (core dumped)它进入Peek函数后我得到了一个权利。
我猜这与*(int *)我对 的返回值所做的转换有关Peek(),但我想不出任何其他方式来print()或显示void *.传递的任何值。我的意思是,我必须将它投射到int *或char *或其他什么,对吗?
我在这里做错了什么?我很高兴听到有关如何更好地理解整件事pointers的任何提示。我的意思是,我认为我很擅长它,但我想我错了。 …
以下代码是我的较大程序的简化版本,用于演示问题。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
const int m = 5;
char **words1;
char **words2;
void f(void *v) {
printf("v: %p\n", v);
int len = v==words1 ? 3 : 4;
printf("len: %d\n", len);
for (int i=0; i<m; i++) {
// What goes here?
/*
char *c = malloc(sizeof(char) * len);
c = (char*)v; // Something _like_ this?!
printf("%s\n", c);
*/
}
}
int main(int argc, char *argv[]) {
words1 = malloc(m * sizeof(char*));
printf("%p\n", words1);
words2 = malloc(m * …Run Code Online (Sandbox Code Playgroud) 代码 1
#include <iostream>
int main()
{
std::cout << nullptr;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出
Error: Use of overloaded operator '<<' is ambiguous (with operand types 'std::ostream' (aka 'basic_ostream<char>') and 'nullptr_t')
Run Code Online (Sandbox Code Playgroud)
甚至有特定类型nullptr显示错误的原因。但
代码 2
#include <iostream>
int main()
{
std::cout << (void*)nullptr;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出
0
Run Code Online (Sandbox Code Playgroud)
工作正常。为什么void*即使它不是类型也能工作?
我是 C 语言初学者,正在学习 C 语言中的函数指针。还有我遇到的问题?
编写一个比较函数来按名称的第一个字符排序?
*int (firstnamecharcompar)(const void * a, const void * b))
这是我的代码解决方案。
#include<stdlib.h>
#include<stdio.h>
#include <stdbool.h>
int compare1(const void *a,const void *b)
{
char *c = *(char**)a;
char *d = *(char**)b;
return c[0] - d[0];
//return ( *(char*)a[0] == *(char*)b[0] );
}
int main()
{
char* str[3];
int i;
for(i=0;i<3;i++)
{
str[i] = (char*)malloc(10*sizeof(char));
}
for(i=0;i<3;i++)
{
printf("Enter %d string => " , i+1 );
scanf("%s", str[i]);
printf("\n");
}
for(i=0;i<3;i++)
{
printf("%s ",str[i]);
}
qsort(str,3,10,compare1);
for(i=0;i<3;i++) …Run Code Online (Sandbox Code Playgroud) 我无法理解为什么编译器在分配不兼容的指针时不发出警告(?:),但在直接分配时发出警告。
在这种情况下编译器会发出警告:
\n\n\ntest.c:在函数 \xe2\x80\x98main\xe2\x80\x99 中:test.c:8:4:警告:分配给\n\xe2\x80\x98uint32_t *\xe2\x80\x99 {aka \xe2 \x80\x98unsigned int *\xe2\x80\x99} 来自不兼容的指针类型\n\xe2\x80\x98uint32_t **\xe2\x80\x99 {aka \xe2\x80\x98unsigned int **\xe2\x80\x99 } [-Win兼容指针类型]\n8 | a = 数组;\n| ^
\n
#include <stdint.h>\n#include <stdlib.h>\n\nint main(void)\n{\n uint32_t *array[10], *a;\n a = array;\n}\nRun Code Online (Sandbox Code Playgroud)\n以下情况不会发出警告:
\n#include <stdint.h>\n#include <stdlib.h>\n\nint main(void)\n{\n int b = 8;\n uint32_t *array[10], *a;\n\n a = (b >= 8) ? array : malloc(8);\n}\nRun Code Online (Sandbox Code Playgroud)\n环境:
\nGcc version 9.3.0\nUbuntu 20.04\ncompilation cmd: gcc test.c -o test.out\nRun Code Online (Sandbox Code Playgroud)\n c gcc conditional-operator void-pointers implicit-conversion