我一直在看米切尔、奥尔德姆和塞缪尔的高级Linux编程。我在pthread的章节中看到了一些让我困惑的关于空指针和铸造的内容。
将参数传递给pthread_create(),它们不会将指针强制转换为空指针,即使这是函数所期望的。
pthread_create( &thread, NULL, &compute_prime, &which_prime );
这里,which_prime类型为int。
但是使用pthread_join从线程返回一个值,它们会将变量强制转换为void指针。
pthread_join( thread, (void*) &prime );
这里,prime也是int类型。
为什么铸造是在第二次而不是在第一次?
在C语言中,从任何指针类型转换为void*,反之亦然,都是隐式完成的。在第二个示例中,不需要强制转换。
(请注意,在C中,将任何指针转换为void*也是隐式的(除了不能转换为void*的函数指针和函数成员/方法指针),但是转换回需要显式转换。)
无需从或向C中指向void
的指针强制转换:
6.3.2.3指针
1一个指针可以转换为或从指针到任何不完整或对象类型。指向任何不完整或对象类型的指针可以转换为空指针并再次返回;结果应等于原始指针。
唯一的例外是
“%p”
转换说明符打印指针时,因为它仅为void*
定义
第二个例子是一个很好的例子,说明了为什么强制转换为void*
通常是一个错误。应该是
void *primep = ′ // no cast needed
pthread_join(thread, &primep);
因为pthread\u join
将void**
作为其第二个参数。void*
只确保bug通过编译器,因为void*
会自动转换为void**
。
那么,什么时候需要强制转换到space*
或back:
(u)intptr\u t
)
问题内容: 我对JAX-WS进行了概述,并注意到了(和)的一些引用。 在什么情况下需要?(我认为JSR 109服务器?!) 问题答案: 是使用SUN的参考实现将Web服务作为标准存档部署在非Java EE5 Servlet容器上时所需的专有部署描述符。 Sun的RI 用作servlet上下文事件的侦听器和调度程序servlet。两者都必须在中声明。然后需要该文件为定义Web服务端点,以使其知道必须
问题内容: 我的印象是,在URL属性(如hrefs)中使用JavaScript时,我只需要指定“协议”。这是唯一的“有用”上下文吗? 明智的: 愚蠢: 这是正确的吗?还是我需要注意一些晦涩的错误/用例? 问题答案: 事件处理程序上的伪协议将仅被忽略,您不需要它,JavaScript引擎将解释为LabelStatement。 标签只是为语句提供标识符,并允许您在程序的其他位置引用它。 恕我直言,此伪
问题内容: 通常我会尽可能避免转换类型,因为我认为这是不良的编码实践,并且可能会导致性能下降。 但是,如果有人要我解释为什么会这样,我可能会像前灯中的鹿一样看它们。 那么,为什么/何时铸造不好? 它对于Java,C#,C ++是通用的,还是每个不同的运行时环境都按照自己的方式处理? 欢迎使用任何语言的细节,例如为什么在c ++中不好? 问题答案: 您已经用三种语言标记了这三种语言,答案在三种语言之
问题内容: 我使用类只有很短的时间,编写方法时,我使所有变量都引用了self,例如self.foo。 但是,我在浏览《 wxPython in Action》 一书时发现,“ self”并没有一直使用。例如: 下面的一个确实使用“自我”。 如果我没记错的话,“自我”是指该类的特定实例,那么什么时候没有必要?有一般的经验法则吗? 问题答案: 您用于引用当前实例的属性。 您用于引用父类的方法。 如果仅
谷歌正在通过电子邮件通知Android位置权限的更改: 我们将于2016年10月15日进行更改,这将影响针对API版本21(Android 5.0、Lollipop)或更高版本的应用程序,这些应用程序使用ACCESS_FINE_LOCATION但没有明确具有“android.hardware.location.gps”用途功能。展望未来,这些应用程序将可安装在没有GPS硬件的设备上。在大多数情况下