我有一个结构,里面有一个指向2D数组的指针。但是当我尝试将一个实际的2D数组分配给该指针时,我没有成功 - 编译器说我的指针是指向一维数组的指针。
这是我的代码:
typedef GLfloat Vertex2f[2];
typedef GLfloat TextureCoordinate[2];
typedef struct {
GLuint texture_name; // OpenGL ID of texture used for this sprite
Vertex2f *vertices; // array of vertices
TextureCoordinate *texture_coords; // texture vertices to match
GLubyte *vertex_indices;
} game_sprite;
void loadState()
{
game_sprite ballSprite;
createAndLoadTexture("ball.png", &ballSprite.texture_name);
const Vertex2f tempVerticesArray[4] = {
{-100.0f, -100.0f},
{-100.0f, 100.0f},
{100.0f, 100.0f},
{100.0f, -100.0f}
};
ballSprite.vertices = &tempVerticesArray; //The problem appears to be here
}
我怎样才能让它发挥作用?
感谢。
答案 0 :(得分:7)
你有两个问题。首先,tempVerticesArray
是const
。在没有类型转换的情况下,您无法将指向const
值(&tempVerticesArray
)的指针指向指向非const
变量(ballSprite.vertices
)的指针,因此编译器是抱怨。您应该将vertices
数据成员修改为类型const Vertex2f *
,假设您实际上并未实际修改该数据。
第二个问题是,只要loadState()
结束,变量tempVerticesArray
就会超出范围,因此任何悬挂指针(特别是ballSprite.vertices
)都是无效的。您应该使tempVerticesArray
成为static
变量,因此它不是可以超出范围的堆栈变量。这假设在该函数结束后使用ballSprite
对象,我猜它是基于上下文的。
如果你做需要在初始化后修改你的顶点,你需要为每个ballSprite
分配它自己的一组顶点数据(例如使用malloc()
)和复制顶点数据(例如使用memcpy()
)。如果不这样做,则所有ballSprite
实例将共享指向相同顶点数据的指针,当您修改它们时,它们都将受到影响。
答案 1 :(得分:3)
我的C有点生疏,但不应该是:
ballSprite.vertices = tempVerticesArray;
答案 2 :(得分:3)
在C中,数组实际上是指向第一个成员的指针,因此当你执行
时ballSprite.vertices = &tempVerticesArray;
你实际上是在尝试为ballSprite.vertices指定一个指向指针的值
放弃&你可以使用ballSprite.vertices = tempVerticesArray;
答案 3 :(得分:2)
只是为了澄清,我不认为
Vertex2f *vertices
声明一个“2D数组”,它是一个Vertex2f的1维数组。
但正如Mitch所指出的,问题可能是tempVerticesArray,如此处所声明的,是一个1d数组,与指向Vertex2f的指针相同。所以& tempVerticesArray是这个指针的地址(Vertex2f * *)。
答案 4 :(得分:1)
您可以使用
ballSprite.vertices = tempVerticesArray;
或
ballSprite.vertices = &tempVerticesArray[0];
答案 5 :(得分:1)
您可能希望为指针分配内存来保存数据。然后将临时数组memcpy到新分配的内存中。如果您只是想让指针直接引用数组,那么在离开该函数时可能会出现问题。在您可以在其他地方使用指针之前,将释放堆栈上生成的临时数组。