Почему я получаю EXC_BAD_ACCESS после приведения через int? - PullRequest
2 голосов
/ 06 марта 2012

В приведенном ниже коде я получаю ошибку EXC_BAD_ACCESS без видимой причины, когда я вызываю print vertex. Указатели указывают на одно и то же местоположение, но каким-то образом происходит сбой при переходе в vp2.

#include <stdio.h>

typedef struct {
    float x;
    float y;
    float z;
} Vertex;

void printVertex(Vertex *v);

int main (int argc, const char * argv[])
{
    Vertex v = {1,0,2};
    int memL = (int)&v;
    Vertex *vp = &v;

    printf("Memory Location: %i\n", memL);
    printf("Memory Pointed to by Pointer: %i\n", (int)vp);

    Vertex *vp2 = (Vertex *)memL;
    printf("Memory Pointed to by Pointer from memory location: %i\n", (int)vp2);

    printVertex(vp);  // Executes normally
    printVertex(vp2); // EXC_BAD_ACCESS

    return 0;
}

void printVertex(Vertex *v)
{
    printf("Vertex[%f,%f,%f]\n", v->x, v->y, v->z); // EXC_BAD_ACCESS when vp2 passed in
}

Выход:

Memory Location: 1606416816
Memory Pointed to by Pointer: 1606416816
Memory Pointed to by Pointer from memory location: 1606416816
Vertex[1.000000,0.000000,2.000000]
EXC_BAD_ACCESS Error

Ответы [ 2 ]

2 голосов
/ 06 марта 2012
int memL = (int)&v;

Возможно усечение адреса v.Вы можете попробовать:

intptr_t memL = (intptr_t)&v;

, чтобы увидеть, так ли это.Это не должно произойти сбой, если усечение является проблемой.

1 голос
/ 06 марта 2012

Ваши указатели имеют ширину 64 бита, но ваш тип int имеет ширину всего 32 бита.Вы отбрасываете половину информации указателя!

...