sizeOf Struct和sizeOf Instance变量返回不同的值

时间:2013-04-17 19:53:02

标签: objective-c

我正在使用Objective-C中的C Api。此API需要使用某些特定结构。 我试图弄清楚如何使用结构数组时遇到一些问题。

我用一些代码向您展示了更多内容:

我有一个类Sprite,我在其中定义了结构Vertex。 Sprite的每个实例都有自己的顶点数组。

#import <Foundation/Foundation.h>  

typedef struct {
    float Position[3];
    float Color[4];
} Vertex;

@interface Sprite : NSObject{
    Vertex *_vertices;
}

//Getter setter methods 
-(void)setVertices:(Vertex*)vx;
-(Vertex*)vertices;
@end

在另一个类中,我以这种方式使用Sprite类: 我创建了一个Vertex数组,并将此结构分配给Sprite的一个实例:

Sprite *spr = [[Sprite alloc]init];

Vertex vertices2[] = {
    {{1, -1, 0}, {1, 0, 0, 1}},
    {{1, 1, 0}, {1, 0, 0, 1}},
    {{-1, 1, 0}, {1, 1, 0, 1}},
    {{-1, -1, 0}, {1, 1, 0, 1}}
};

spr.vertices = vertices2;

现在,如果我直接在sizeOf结构上执行vertices2,我会在112上获得值sizeOf并执行spr.vertices,我会4 。为什么???我的意思是这是具有相同值的相同结构。

我怀疑是我正在使用array []和指针*以错误的方式...

如何修改Sprite类以正确的方式使用struct数组?

2 个答案:

答案 0 :(得分:2)

spr.vertices是一个指针。 vertices2是Vertex对象的实际数组。它们是不同的数据类型。

答案 1 :(得分:2)

sizeof在编译时计算其参数的大小。如果传递一个指针,它将返回指针类型的大小(通常为4或8个字节)。即使你传递了一个解除引用的指针,即sizeof(*spr.vertices),你也会获得Vertex类型的大小,而不是你的特定实例。

如果您需要在运行时知道实例的大小,请将其(大小)放在另一个ivar中。

相关问题