看到这个线程我写了以下内容: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)
海湾合作委员会
我错过了什么?
所以我尝试使用 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 语言句柄的文章,并意识到我们将句柄实现为 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 语言初学者,正在学习 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) 我使用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,但两者都没有成功。
我尝试使用 sizeof() 来查找 void 指针指向的值的大小,我想用它来打印该值。
这段代码
int num = 5;
void *voidPtr;
voidPtr = #
printf("%d", sizeof(*voidPtr));
Run Code Online (Sandbox Code Playgroud)
打印,1。我怎样才能打印4?
如果有任何其他方法来打印 void 指针的值,请告诉我
提前致谢。
我正在努力整合代码库(将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 库。所以我的问题是:为什么memchr采用const void *s指针而不是简单的字符指针?
我发现您可能可以搜索其他内容,但该函数实际上称为memchr那么为什么要使用 void 指针呢?
提前致谢!
在尝试重新创建“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) 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 查询”的结果存储到二维字符串数组中。