You should pass a pointer to "&triangle" and with sizeof(triangle) now you allocate memory for only the first position. And then try to set opengl where to search for specified data like normals. It would be a great start to read and try out some example."
#define BUFFER_OFFSET(i) ((char *)NULL + (i)) glEnableVertexAttribArray(GLKVertexAttribPosition); glVertexAttribPointer(GLKVertexAttribPosition, 3, GL_FLOAT, GL_FALSE, 24, BUFFER_OFFSET(0)); glEnableVertexAttribArray(GLKVertexAttribNormal); glVertexAttribPointer(GLKVertexAttribNormal, 3, GL_FLOAT, GL_FALSE, 24, BUFFER_OFFSET(12)); glEnableVertexAttribArray(GLKVertexAttribTexCoord0); glVertexAttribPointer(GLKVertexAttribTexCoord0, 2, GL_FLOAT, GL_FALSE, 24, BUFFER_OFFSET(24));
sizeof() gives you the size of the variable in bytes, not the amount of data stored in them. In your case all vertexes has 8 elements (3+3+2 = 8) and 3 vertexes (3*8=24).