标签: void-pointers

类型转换 void 指针到 int 时出现分段错误

看到这个线程我写了以下内容:How do I conversion from void * back to int

#include <iostream>
#include <stdlib.h>
using namespace std;

int main (int argc, char *argv[])
{
    void* port = (void*) atoi (argv[1]);

    cout << "\nvalue: \n" << atoi (argv[1]) << "\n";

    int h = *((int *)port);
    cout << h;
}
Run Code Online (Sandbox Code Playgroud)

输出:

anisha@linux-dopx:~/> ./a.out 323

value: 
323
Segmentation fault
anisha@linux-dopx:~/>
Run Code Online (Sandbox Code Playgroud)

海湾合作委员会

我错过了什么?

c++ void void-pointers segmentation-fault

2
推荐指数
1
解决办法
5551
查看次数

Qsort 没有按照我期望的方式使用 void 指针工作

所以我尝试使用 qsort 对 C 中的 void 指针的通用数组列表进行排序。

当我实际使用数组列表时,我正在存储Queue指针。

我很确定我打电话是qsort正确的

qsort(al->list, al->size, sizeof(void *), al->cf );
Run Code Online (Sandbox Code Playgroud)

在我的比较器函数中,我想这样做

int compareQCtgry(const void * queueA, const void * queueB)
{
    Queue * q1 = (Queue *) queueA;
    Queue * q2 = (Queue *) queueB;
    return strcmp(q1->category, q2->category);
}
Run Code Online (Sandbox Code Playgroud)

但是,我遇到了段错误。

但是当我将其更改为

int compareQCtgry(const void * queueA, const void * queueB)
{
    Queue * q1 = *(Queue **) queueA;
    Queue * q2 = *(Queue **) queueB;
    return strcmp(q1->category, q2->category);
}
Run Code Online (Sandbox Code Playgroud)

它有效,但对我来说毫无意义。为什么将 void …

c pointers void-pointers

2
推荐指数
1
解决办法
332
查看次数

C++ 中的句柄、空指针、对象

因此,我正在阅读有关C 语言句柄的文章,并意识到我们将句柄实现为 void 指针,因此我们获得的“任何”对象/数据类型都可以将 void 指针转换为该类型的对象/数据并获取其值。所以我基本上有两个担忧:

1.如果让我们说下面的例子取自C中的Handle

 typedef void* HANDLE;   
 int doSomething(HANDLE s, int a, int b) {
         Something* something = reinterpret_cast<Something*>(s);
         return something->doit(a, b);
     }
       
Run Code Online (Sandbox Code Playgroud)

如果我们将值传递给函数dosomething(21,2,2),这是否意味着 HANDLE 指向的值是 21,如果是的话,当我们键入时,任何对象如何将其转换为该对象,它是否能够使用它,就像在这个例子中一样,所以在换句话说,指向对象 Something 的指针something将在哪里存储值 21。

2.其次,该链接还显示“因此,在您的代码中,您只需将 HANDLE 作为不透明值传递”,这实际上是什么意思?为什么我们要“传递句柄”?如果有人能给出更有说服力的使用对象的句柄示例,那就太好了!

c++ handle void-pointers

2
推荐指数
1
解决办法
5623
查看次数

关于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][10];
    int i;
    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++)
    {
        printf("%s ",str[i]);
    } …
Run Code Online (Sandbox Code Playgroud)

c pointers function-pointers function void-pointers

2
推荐指数
1
解决办法
50
查看次数

如何向另一个线程发送指针?

我使用bindgen为相机的C++库创建了一个Rust包装器,并且C++库中的相机句柄定义为typedef void camera_handlebindgen移植的:

pub type camera_handle = ::std::os::raw::c_void;
Run Code Online (Sandbox Code Playgroud)

我能够成功连接到相机并拍摄图像,但是我想在单独的线程上运行代码来控制相机的温度,本质上是根据相机的当前温度改变冷却器功率,我想要与其余代码分开运行。这些调用需要相机句柄,但是当我生成新线程时,我不断收到错误:

pub type camera_handle = ::std::os::raw::c_void;
Run Code Online (Sandbox Code Playgroud)

在它的下面,它提到:

'*mut std::ffi::c_void' cannot be sent between threads safely
Run Code Online (Sandbox Code Playgroud)

如何将其发送到另一个线程,以便我也可以在那里使用该相机手柄?我尝试过使用脆弱send_wrapper,但两者都没有成功。

c++ ffi void-pointers rust rust-bindgen

2
推荐指数
1
解决办法
1960
查看次数

C | 使用 sizeof() 查找 void 指针指向的值的大小

我尝试使用 sizeof() 来查找 void 指针指向的值的大小,我想用它来打印该值。

这段代码

    int num = 5;
    void *voidPtr;
    voidPtr = &num;
    printf("%d", sizeof(*voidPtr));
Run Code Online (Sandbox Code Playgroud)

打印,1。我怎样才能打印4?

如果有任何其他方法来打印 void 指针的值,请告诉我

提前致谢。

c pointers sizeof void void-pointers

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

为什么可以使用具有错误签名的比较函数调用“qsort”并且编译没有警告

我正在努力整合代码库(将qsort compar函数移动到新的标头/库,以便可以在不复制/意大利面的情况下共享它),并注意到在此过程中出现了一些奇怪的情况。

这是一个示范性清单:

#include <stdlib.h>
#include <string.h>
#include <stdio.h>

 /** One record has three fields.
 * Each field contains a NULL terminated string of length at most 7 characters. */
typedef char Record[3][8];

int main(void)
{
    Record database[5] = {0};

    strcpy(database[0][0], "ZING");
    strcpy(database[0][1], "BOP");
    strcpy(database[0][2], "POW");

    strcpy(database[1][0], "FIDDLY");
    strcpy(database[1][1], "ECHO");
    strcpy(database[1][2], "ZOOOM");

    strcpy(database[2][0], "AH");
    strcpy(database[2][1], "AAAAA");
    strcpy(database[2][2], "AH");

    strcpy(database[3][0], "BO");
    strcpy(database[3][1], "DELTA");
    strcpy(database[3][2], "FO");

    strcpy(database[4][0], "FRRING");
    strcpy(database[4][1], "CRASH");
    strcpy(database[4][2], "FOO");

    //(gdb) ptype record_compare_field_1
    //type = int (char (*)[8], …
Run Code Online (Sandbox Code Playgroud)

c void-pointers qsort

2
推荐指数
1
解决办法
98
查看次数

为什么 memchr() 采用 void 指针作为输入?

我目前正在重新编程一些 C 库。所以我的问题是:为什么memchr采用const void *s指针而不是简单的字符指针?

我发现您可能可以搜索其他内容,但该函数实际上称为memchr那么为什么要使用 void 指针呢?

提前致谢!

c pointers void-pointers

2
推荐指数
1
解决办法
247
查看次数

memset 函数的正确类型是什么?

在尝试重新创建“memset”函数时,如果我尝试取消引用 void 指针,或者第二个参数的类型与第一个参数的类型不同,则会出错。为了使该功能正常工作,我必须将其更改为:

void ft_memset(unsigned char *st, unsigned char c, size_t n)
Run Code Online (Sandbox Code Playgroud)

是否可以像手册中那样定义该功能?

void *memset(void *s, int c, size_t n)  <- This is the man version.
Run Code Online (Sandbox Code Playgroud)

我只使用库 stdio.h 来使用 size_t 我必须使用 -Wall -Wextra -Werror 进行编译

这是我的代码:

#include <stdio.h>

//stdio.h to use size_t;
//

void *ft_memset(unsigned char *str, unsigned char c, size_t n)
{
    unsigned int i;

    i = 0;
    while (i < n)
    {
        str[i] = c;
        i++;
    }
    return(str);
}
Run Code Online (Sandbox Code Playgroud)

c char memset void-pointers function-definition

2
推荐指数
1
解决办法
338
查看次数

将 void 指针转换为 2D String 数组指针

void*我正在使用一个库,它需要一个以指针作为参数的函数。我有一个 2D 字符串数组,我想通过该参数传递该数组并将其提取到函数内。我成功地将数组作为指针传递,但我不知道如何将该指针转换回我的数组。

这是我当前的代码:

String str_array[100][10];

int callback(void* data) {

  String* str_array_ptr[100][10] = (String* [100][10])data;

  (*str_array_ptr)[0][0] = "text";

  return 0;

}

void test() {
  callback(&str_array);
}
Run Code Online (Sandbox Code Playgroud)

但是,在编译时,我收到以下错误消息:

错误:ISO C++ 禁止转换为数组类型 'String* [100][10]' [-fpermissive]

PS:我正在尝试使用SQLite库的sqlite3_exec()函数并将“SELECT SQL 查询”的结果存储到二维字符串数组中。

SQLite C 接口 - 一步查询执行接口

c++ arrays pointers casting void-pointers

2
推荐指数
1
解决办法
376
查看次数