我试图理解这意味着什么,我正在看的代码
在.h
typedef void (*MCB)();
static MCB m_process;
Run Code Online (Sandbox Code Playgroud)
在.C
MCB Modes::m_process = NULL;
Run Code Online (Sandbox Code Playgroud)
有时当我做的时候
m_process();
Run Code Online (Sandbox Code Playgroud)
我得到了分段错误,这可能是因为内存被释放了,我怎样才能在它被释放时进行调试?
我希望我的问题很清楚.
所以我正在经历一些面试问题,我遇到了一个关于void和null指针的问题,声称:
没有返回类型的指针称为空指针.它可以是任何类型的数据类型.
这彻底迷惑了我!它似乎无效,根据这个问题,null可以互换使用,我不相信这是正确的.我假设void是一个返回类型,null是一个值.但我只是一个代码新手,我不确定我是对的.
请表达您对空指针是什么以及空指针是什么的看法.我不是在寻找null和void之间的区别.
我正在读一本书而且我发现reinterpret_cast不应该直接使用,而是将其与无效*结合使用static_cast:
T1 * p1=...
void *pv=p1;
T2 * p2= static_cast<T2*>(pv);
Run Code Online (Sandbox Code Playgroud)
代替:
T1 * p1=...
T2 * p2= reinterpret_cast<T2*>(p1);
Run Code Online (Sandbox Code Playgroud)
但是,我找不到解释为什么这比直接演员更好.如果有人能给我一个解释或指出我的答案,我将非常感激.
提前致谢
ps我知道用的是什么reinterpret_cast,但我从未见过以这种方式使用它
我的一个朋友从“理解和使用 C 指针 - Richard Reese,O'Reilly 出版物”中指出了第二个要点,我无法解释其中的第一句话。我错过了什么?
空指针
指向 void 的指针是一个通用指针,用于保存对任何数据类型的引用。指向 void 的指针的示例如下所示:
Run Code Online (Sandbox Code Playgroud)void *pv;它有两个有趣的特性:
- 指向 void 的指针将具有与指向 的指针相同的表示形式和内存对齐方式
char。- 指向 void 的指针永远不会等于另一个指针。但是,分配了一个
NULL值的两个空指针将是相等的。
这是我的代码,不是书中的代码,所有指针都具有相同的值并且相等。
#include <stdio.h>
int main()
{
int a = 10;
int *p = &a;
void *p1 = (void*)&a;
void *p2 = (void*)&a;
printf("%p %p\n",p1,p2);
printf("%p\n",p);
if(p == p1)
printf("Equal\n");
if(p1 == p2)
printf("Equal\n");
}
Run Code Online (Sandbox Code Playgroud)
输出:
0x7ffe1fbecfec 0x7ffe1fbecfec
0x7ffe1fbecfec
Equal
Equal
Run Code Online (Sandbox Code Playgroud) 我知道delete空指针是一个无操作:
在任一替代方案中,如果delete的操作数的值是空指针,则操作无效.
(C++标准5.3.5 [expr.delete] p2)
并且删除void*指针是未定义的行为,因为无法调用析构函数,因为没有类型的对象void:
在第一个alternative(
delete object)中,delete的操作数的值应该是指向非数组对象的指针或指向表示这种对象的基类的子对象的指针.如果不是,则行为未定义.
(C++标准5.3.5 [expr.delete] p2)
现在,通常我认为列出的东西首先列出了后面列出的东西,但是空void*指针如下呢?
void* p = 0;
delete p; // UB or well-defined?
Run Code Online (Sandbox Code Playgroud) c++ void-pointers null-pointer undefined-behavior language-lawyer
在仔细阅读网页并弄乱自己之后,我似乎无法将void*的目标(这是一个字符串)转换为std :: string.我尝试使用此页面的sprintf(buffer, "%p", *((int *)point));建议来获取C字符串,但无济于事.遗憾的是,是的,我必须使用void*,因为这是SDL在其USEREVENT结构中使用的.
对于那些感兴趣的人,我用来填充Userevent的代码是:
std::string filename = "ResumeButton.png";
SDL_Event button_press;
button_press.type = BUTTON_PRESS;
button_press.user.data1 = &filename;
SDL_PushEvent(&button_press);
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
编辑:感谢所有的回复,我只需要将void*转换为std :: string*.傻我.非常感谢你们!
我正在学习Pthreads.我的代码按照我想要的方式执行,我可以使用它.但它给了我一个关于编译的警告.
我编译使用:
gcc test.c -o test -pthread
Run Code Online (Sandbox Code Playgroud)
与GCC 4.8.1.我得到了警告
test.c: In function ‘main’:
test.c:39:46: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast]
pthread_create(&(tid[i]), &attr, runner, (void *) i);
^
test.c: In function ‘runner’:
test.c:54:22: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast]
int threadnumber = (int) param;
^
Run Code Online (Sandbox Code Playgroud)
此错误来自以下代码:
#include <pthread.h>
#include <stdlib.h>
#include <stdio.h>
#define MAX_THREADS 10
int sum; /* this data is shared by the thread(s) */
void *runner(void * param);
int main(int argc, …Run Code Online (Sandbox Code Playgroud) 5.2.7/7说的内容如下:
如果
T是"指向cv void",则结果是指向由其指向的派生类最多的指针x.
这个synatx有什么好的应用?什么时候应该dynamic_cast<void*>使用?
我对C中的void*指针有点困惑.特别是在读完这个问题后:sizeof(某些指针)是否总是等于4?,一个人说没有保证sizeof(int*)== sizeof(double*)
我的问题是:是否有sizeof(void*)> = sizeof(任何其他指针类型)的保证?换句话说,我是否可以始终为void*指针指定some_type*指针,然后将其作为some_type*返回?
void-pointers ×10
c++ ×7
c ×2
casting ×2
dynamic-cast ×2
null-pointer ×2
pointers ×2
c++11 ×1
gcc ×1
gcc-warning ×1
int ×1
printf ×1
rtti ×1
string ×1
typedef ×1