标签: void-pointers

C:复制数组而不知道其类型

我有函数,它接收指向数组的指针和指向函数的指针,并应返回由参数传递的函数定义的新数组.我的问题是如何将一个数组的元素复制到另一个数组而不知道它的类型

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)

c arrays void-pointers

0
推荐指数
1
解决办法
1298
查看次数

将void*指向char*转换为c ++中的std :: string

从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::stringstatic_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)

c++ string void-pointers

0
推荐指数
1
解决办法
2272
查看次数

另一个无效*主题; 我只是要问,因为我很困惑

好吧,虽然堆栈上的详细信息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)

c99 void-pointers c++11

0
推荐指数
1
解决办法
65
查看次数

C使用三元运算符的void指针

我有一个与三元条件运算符一起使用的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而不是它但我只是好奇它为什么这样工作.谁能帮助我?

c ternary-operator void-pointers

0
推荐指数
1
解决办法
186
查看次数

将 void 指针指向的 std::thread 转换为对象 std::thread 而不是指向对象的指针

我正在寻找我所做的练习,特别是一个“线程管理器”类,它通过将线程存储在“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)

c++ void-pointers stdthread

0
推荐指数
1
解决办法
65
查看次数

如何在 C 中打印 (void **) 数据?

我很难完全理解和学习指针、强制转换和所有这些的行为。

我有以下结构,它基本上是一个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的任何提示。我的意思是,我认为我很擅长它,但我想我错了。 …

c stack pointers void-pointers data-structures

0
推荐指数
1
解决办法
49
查看次数

如何“重建”腐烂的**char?

以下代码是我的较大程序的简化版本,用于演示问题。

#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)

c void-pointers

0
推荐指数
1
解决办法
51
查看次数

`cout&lt;&lt;nullptr` 给出错误,尽管 `nullptr` 的类型来自 C++17

代码 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++ void-pointers nullptr c++17

0
推荐指数
1
解决办法
62
查看次数

C中的函数指针?

我是 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)

c malloc pointers function-pointers void-pointers

0
推荐指数
1
解决办法
63
查看次数

基于三元运算符 (?:) 的赋值避免了 C 中的类型检查

我无法理解为什么编译器在分配不兼容的指针时不发出警告(?:),但在直接分配时发出警告。

\n

在这种情况下编译器会发出警告:

\n
\n

test.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
\n
#include <stdint.h>\n#include <stdlib.h>\n\nint main(void)\n{\n    uint32_t *array[10], *a;\n    a = array;\n}\n
Run 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}\n
Run Code Online (Sandbox Code Playgroud)\n

环境:

\n
Gcc version 9.3.0\nUbuntu 20.04\ncompilation cmd: gcc test.c -o test.out\n
Run Code Online (Sandbox Code Playgroud)\n

c gcc conditional-operator void-pointers implicit-conversion

0
推荐指数
2
解决办法
237
查看次数