这是从jint *(32位签名)转换为uint32_t *有效吗?它有效,但似乎是一个黑客。编程语言是C。
JNIEXPORT jint JNICALL Java_foo_bar(JNIENV *env, jobject thisObj, jintArray inputDataJava){
/* Input data is signed */
jint * inputDataSigned = (*env)->GetIntArrayElements(env,inputDataJava,0);
/* Input data has been casted to unsigned. Is that valid? */
uint32_t * inputDataUnsigned = (uint32_t *) (*env)->GetIntArrayElements(env,inputDataJava,0);
}
提前致谢
答案 0 :(得分:0)
这是从jint *(32位签名)转换为uint32_t *有效吗?
简而言之,没有。有可能存在一种实现,其中这样的强制转换会导致一些不良行为。
它有效,但似乎是一个黑客。
许多未定义的行为似乎在一个配置中起作用,至少在最初阶段,直到某人注意到 heartbleed 或其他一些未定义的行为可能导致的漏洞,例如。实际上,通常人们会用一个字节溢出它们的数组,并且它们的程序将继续运行......
极少数类型的指针具有足够宽松的对齐要求以指向任何类型。我在C标准中唯一知道的是字符指针类型(char *
,signed char *
,unsigned char *
)和void *
。
使问题复杂化的是标准对此jint *
一无所知,也不知道任何对齐要求。我不相信这样的代码。请参阅C标准的相关转换部分,以了解可接受的内容:6.3.2.3 Pointers以下引用以方便您使用。作为一名程序员,你通常希望避免任何“未定义”。
1指向
void
的指针可以转换为指向任何对象类型的指针。指向任何对象类型的指针可以转换为指向void
并再次返回的指针;结果应该等于原始指针。2对于任何限定符q,指向非q限定类型的指针可以转换为指向该类型的q限定版本的指针;存储在原始指针和转换指针中的值应相等。
3值为0的整型常量表达式或类型
void *
的表达式,称为空指针常量。 66)如果将空指针常量转换为一个指针类型,结果指针,称为空指针,保证比较不等于指向任何对象或函数的指针。4将空指针转换为另一种指针类型会产生该类型的空指针。任何两个空指针都应该相等。
5整数可以转换为任何指针类型。除非之前指定,否则结果是实现定义的,可能未正确对齐,可能不指向引用类型的实体,并且可能是陷阱表示。 67)
6任何指针类型都可以转换为整数类型。除了之前指定的以外,结果是实现定义的。如果结果无法以整数类型表示,则行为未定义。结果不必在任何整数类型的值范围内。
7指向对象类型的指针可以转换为指向不同对象类型的指针。如果结果指针未正确对齐引用类型 68),则行为未定义。否则,当再次转换回来时,结果将等于原始指针。当指向对象的指针转换为指向字符类型的指针时,结果指向对象的最低寻址字节。结果的连续增量,直到对象的大小,产生指向对象剩余字节的指针。
8指向一种类型的函数的指针可以转换为指向另一种类型的函数的指针,然后再返回;结果应该等于原始指针。如果转换的指针用于调用类型与引用类型不兼容的函数,则行为未定义。