我有一个以下的结构
struct teststruct
{
int *a;
void *data;
};
Run Code Online (Sandbox Code Playgroud)
是否可以对包含空指针的结构进行深层复制?我假设我不知道data指针指向多少字节?所以我不能指定malloc指定的字节数并做memcpy.我对吗?
*---编辑 - 现在整个过程*
当我在最后调试它时,"get"和"value"具有不同的值!可能,我转换为void*并以错误的方式返回User?
#include <db_cxx.h>
#include <stdio.h>
struct User{
User(){}
int name;
int town;
User(int a){};
inline int get_index(int a){
return town;
} //for another stuff
};
int main(){
try {
DbEnv* env = new DbEnv(NULL);
env->open("./",
DB_CREATE | DB_INIT_MPOOL | DB_THREAD |
DB_INIT_LOCK | DB_INIT_TXN | DB_RECOVER | DB_INIT_LOG, 0);
Db* datab = new Db(env, 0);
datab->open(NULL, "db.dbf", NULL, DB_BTREE, DB_CREATE | DB_AUTO_COMMIT, 0);
Dbt key, value, get;
char a[10] = "bbaaccd";
User u;
u.name = 1;
u.town …Run Code Online (Sandbox Code Playgroud) 我正在创建一个调用回调函数的类,我希望它在某些情况下传递一些数据,但数据可能会有所不同.在C++中我会使用void*但在C#中它是不安全的,这意味着它可能会得到GCed.有没有办法在C#中传递未知类型的数据?
这段代码:
#include <stdio.h>
int main(void)
{
void *ptr;
int arr[] = {1,2,3,4,5};
ptr = arr;
ptr++;
printf("%d",*(int*)ptr);
}
Run Code Online (Sandbox Code Playgroud)
打印一些垃圾值,但我期待它打印2.为什么不打印2?
我正在考虑修改玩具操作系统,我只是想学习一些代码及其功能.我被赋予了一个"线程"结构,它具有"pcb"结构的成员,这是一个过程控制块,它将线程连接到我认为的底层物理硬件.
无论如何,在这个"pcb"结构中有初始化函数,它初始化新创建的线程的pcb.这是函数定义:
void md_initpcb(struct pcb *, char *stack, void *data1, unsigned long data2,
void (*func)(void *, unsigned long));
Run Code Online (Sandbox Code Playgroud)
关于代码,最后一个参数的含义是什么?它与代码或指令有关
从概念上讲,我对这些东西如何适应大局感到困惑.据我所知,Thread是代码执行的单位; 例如,它可以与用户程序相关,因此线程之间的切换可以快速地提供并行运行进程的错觉.好吧所以这个Thread然后需要它自己的堆栈,寄存器(不明白)和一些控制(pcb).
对不起,如果这到处都是.作为参考,我正在启动OS161项目.
谢谢.
如果我将a传递void *vptr给一个带有other_type *ptrarg 的函数,它会vptr自动转换为other_type *?这是代码,
typedef struct A {
//...
}A;
void bar(A *a)
{
//do something with a
}
int main()
{
A a = {..};
void *vp = &a;
bar(vp); //will vp be converted to A*?
}
Run Code Online (Sandbox Code Playgroud)
我的代码安全或正确吗?
我正在尝试将void*传递给函数,然后在该函数内部使指针指向动态创建的对象.这是我到目前为止,但它似乎没有工作:
主要:
int main()
{
void* objPtr;
setPtr(objPtr);
}
Run Code Online (Sandbox Code Playgroud)
setPtr:
void setPtr(void*& objPtr)
{
objPtr = new Obj1;
(*objPtr).member1 = 10; //error: expression must have pointer-to-class type
}
Run Code Online (Sandbox Code Playgroud)
OBJ1:
struct Obj1
{
int member1;
};
Run Code Online (Sandbox Code Playgroud)
提前致谢
共享指针非常聪明.他们记住了最初构造的类型,以便正确删除它们.以此为例:
struct A { virtual void test() = 0; };
struct B : A { void test() override {} };
void someFunc() {
std::shared_ptr<A> ptr1;
ptr1 = std::make_shared<B>();
// Here at the end of the scope, B is deleted correctly
}
Run Code Online (Sandbox Code Playgroud)
然而,void指针似乎存在一个问题:为了使void指针的向下转换有效,必须将它向下转换为它最初上传的类型.
例如:
void* myB = new B;
// Okay, well defined
doStuff(static_cast<B*>(myB));
// uh oh, not good!
// For the same instance of a child object, a pointer to the base and
// a pointer to the child can …Run Code Online (Sandbox Code Playgroud) 我无法从下面的代码行中找到如何删除上述警告.data是void指针,并且作为回调函数的一部分,将在数据指针中接收字符串.因为我有类型的void指针,但编译器仍然显示警告.
下面的线基本上有两个警告.1.取消引用'void*'指针2.获取'void类型的表达式的地址
service_ind = atoi((const char*)&data[at_response.param[0].start_of_value_index]) ? TRUE:FALSE ;
Run Code Online (Sandbox Code Playgroud)
以下是必填信息
void * data;
AT_PARSER_RESPONSE at_response;
typedef struct
{
/*Other parameters */
AT_PARAM param[AT_MAX_NUM_PARAM];
}AT_PARSER_RESPONSE
Run Code Online (Sandbox Code Playgroud) 所以这段static_cast代码完全合法:
int n = 13;
void* pn = static_cast<void*>(&n);
void** ppn = &pn;
Run Code Online (Sandbox Code Playgroud)
然而,这必须编成一个reinterpret_cast编译:
int n = 13;
int* foo = &n;
void** bar = static_cast<void**>(&foo);
Run Code Online (Sandbox Code Playgroud)
如果我不改变它我得到错误:
错误C2440 ::
static_cast无法转换int **为void **注释:指向的类型不相关; 转换需要reinterpret_cast,C风格的演员或功能风格演员
所以我认为问题是"类型无关".然而,我还是不明白,如果它从去时是确定int*对void*他们怎么能不相关的int**和void**?
c++ void-pointers double-pointer static-cast reinterpret-cast
void-pointers ×10
c ×5
c++ ×4
pointers ×3
arguments ×1
berkeley-db ×1
c# ×1
dereference ×1
function ×1
memcpy ×1
os161 ×1
shared-ptr ×1
static-cast ×1