在C中更改指向数组的指针

时间:2010-01-01 15:00:04

标签: c++ c

我有一个结构,里面有一个指向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
}

我怎样才能让它发挥作用?

感谢。

6 个答案:

答案 0 :(得分:7)

你有两个问题。首先,tempVerticesArrayconst。在没有类型转换的情况下,您无法将指向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到新分配的内存中。如果您只是想让指针直接引用数组,那么在离开该函数时可能会出现问题。在您可以在其他地方使用指针之前,将释放堆栈上生成的临时数组。