我知道这是一个相当愚蠢的问题,但搜索或代码排列似乎没有用。
我有一个像这样定义的结构。
typedef struct
{
int rate;
int duration;
} DummyStructure;
现在,我尝试使用与此类似的代码。
//
DummyStructure* structure;
DummyStructure* structure2;
long int point;
//
structure = (DummyStructure*)malloc(sizeof(DummyStructure));
structure->rate = 19;
structure->duration = 92;
point = (long int)&structure;
// now i'd like to set structure2 to the same memory location as 1.
// point is the 8-byte int location (i assume?) of structure.
// so naturally i'd assume that by casting as a DummyStructure pointer
// that long int would act as a pointer to that 1.
// It doesn't.
structure2 = (DummyStructure*)point;
我强调我已尽力尝试**和*的每一种排列。我只是不明白。要么它不编译,要么它没有编译,当它发生时,我最终得到结构2中包含的字段看似随机的数字。我假设我不知何故我的内存位置不正确,但除了使用&?
之外你怎么能得到它?我有记忆位置,对吗?如何将结构设置到该位置?
EDIT;我忘了提及(后来的答案已经问过),但我打算用这个来为libnibis包装jni。使用jni意味着我无法传回libvorbis所做的任何结构,但它需要它们的核心功能。因此我的包装器将直接使用vorbis来构造结构,并且我将指向它们的指针传递给java,这样当我需要用更多声音填充缓冲区时,我可以简单地从整数值重新引用struct对象指针。
答案 0 :(得分:5)
为什么要尝试将指针转换为整数并返回?只是为了学习,解决问题,解决一些(无限制的)限制,或者是什么?在这样的“普通”程序中做这件事很奇怪,因为没有意义。
问题的一个可能原因是,无法保证指针甚至可以放在long int
中。您可以通过添加以下代码进行检查:
printf("a regular pointer is %u bytes, long int is %u",
(unsigned int) sizeof structure, (unsigned int) sizeof point);
如果打印的数字不同,那可能是导致问题的最大原因。
如果您使用的是C99,则应该#include <stdint.h>
,然后使用intptr_t
类型而不是unsigned long
来保存指针。
答案 1 :(得分:4)
structure
已经是一个指针,所以你不必在那里取地址:
long int point = reinterpret_cast<long int>(structure);
DummyStructure* structure2 = reinterpret_cast<DummyStructure*>(point);
答案 2 :(得分:3)
structure
已经是一个指针。你只想做point = (long int) structure;
(虽然,实际上,为什么一个long int都参与其中,我不知道。从structure2=structure;
开始工作更加容易structure
}和structure2
都是指针。)
执行&structure
时,您将获得存储指针本身的内存位置,这就是为什么它不是正确的值。你可能真的不想使用&structure
,除非它被传递给一个函数,该函数将改变DummyStructure structure
指向的位置。
答案 3 :(得分:3)
其他人已经回答了你的问题,但我想做一个更一般性的评论。你提到JNI;在这种情况下,您不希望long int
,而是jlong
(这将是long int
或long long int
的typedef,具体取决于计算机。问题是long
将具有不同的大小,具体取决于计算机,并将映射到不同的Java类型。当然,您指望jlong
足以容纳指针的事实,但由于jlong
是64位,这对于近期来说似乎是一个安全的选择(并且超出 - 我没有看到64位寻址不足的时间)。
另外,我建议你从Swig借用一个想法,并通过使用类似下面的内容来避免指向整数转换的指针的微妙之处:
jlong forJNI = 0;
*reinterpret_cast<DummyStructure*>( &forJNI ) = structure;
// ...
structure2 = *reinterpret_cast<DummyStructure*>( &forJNI );
这很丑陋,但保证可以为所有人工作(有一点需要注意)
系统sizeof(DummyStructure*) <= 64
。
请务必在关闭严格别名的情况下进行编译。 (你必须 无论何时在指针和整数之间进行转换,都要执行此操作。恕我直言,你不应该 必须在编译器可以看到强制转换的情况下,但有些 编译器编写者更喜欢有意破坏代码,即使是 意图很清楚。)
答案 4 :(得分:1)
长整数与指针不同。你为什么不这样做:
DummyStructure** point;
structure = malloc(sizeof(DummyStructure));
structure->rate = 19;
structure->duration = 92;
point = &structure;
structure2 = *point;
问题可能是1)你没有取消引用点这一事实的组合。 structure2
是指向structure
的指针,它本身就是一个指针。你必须这样做:
structure2 = *((DummyStructure*)point);
但最重要的是,长整数与指针不同。这里可能还有一个签名问题。
答案 5 :(得分:0)
point = (long int)&structure;
这会将structure
的地址设为DummyStructure*
,并将其分配给point
。所以point
应该是一个双指针(指向指针的指针)。当你指定structure2
时,它应该是正确的类型铸造。
typedef struct
{
int rate;
int duration;
} DummyStructure;
DummyStructure* structure;
DummyStructure* structure2;
long int **point;
structure = (DummyStructure*)malloc(sizeof(DummyStructure));
structure->rate = 19;
structure->duration = 92;
point = (long int **)&structure;
structure2 = (DummyStructure*)*point;
如果您的目的是让structure2
指向与structure
相同的内存位置,为什么不直接指定它而不是中间long int **
。
答案 6 :(得分:0)
错误是point
是structure
的地址,DummyStructure
本身是指向structure2
的指针。为了使structure
指向与point
相同的内容,您需要取消引用structure2 = *(DummyStructure**)point;
。忽略第二个全长,签名和类似问题,
structure2 = structure;
会修复你的代码。但为什么不呢:
void*
如果你真的想把指针放在通用的东西中,请把它放在{{1}}中。至少那个尺寸合适。