Как выделить массив указателей на структуру - PullRequest
2 голосов
/ 19 марта 2011

Я использую CvPoint2D32f структуру opencv, которая определена как

typedef struct CvPoint2D32f
    {
        float x; /* x-coordinate, usually zero-based */
        float y; /* y-coordinate, usually zero-based */
    }
    CvPoint2D32f;

Я пытаюсь выделить массив указателей этих объектов следующим образом, и он не работает.Как это сделать?

CvPoint2D32f *cvpoints[8];
for (i = 0; i < 16; i++)
    {
        if (i % 2 == 0)
        {
            (*cvpoints)[i/2].x = float(points[i]); // points is an array of ints.  
        }
        else
        {
            (*cvpoints)[i/2].y = float(points[i]);
        }
    }

Ответы [ 4 ]

5 голосов
/ 19 марта 2011

У вас есть массив указателей на CvPoint2D32f, а не массив самих структур. У вас нет памяти, выделенной для фактических структур. У вас есть три варианта:

  • Измените ваше объявление на CvPoint2D32f cvpoints[8];, чтобы у вас были все структуры в массиве в стеке.
  • После выделения массива для указателей добавьте оператор malloc для выделения памяти. Пример:

    CvPoint2D32f *cvpoints[8];
    for (i = 0; i < 8; i++)
        {
        cvpoints[i] = (CvPoint2D32f *)malloc(sizeof(CvPoint2D32f));
        }
    
  • Используйте malloc, чтобы выделить размер для всех структур. Пример:

    CvPoint2D32f *cvpoints = (CvPoint2D32f *)malloc( 8 * sizeof(CvPoint2D32f));
    
1 голос
/ 19 марта 2011
CvPoint2D32f *cvpoints = (CvPoint2D32f*) malloc(sizeof(struct CvPoint2D32f) * 8);
memset(cvpoints, \0, sizeof(struct CvPoint2D32f) * 8);

for (i = 0; i < 16; i++)
{
    if (i % 2 == 0)
    {
        cvpoints[i/2].x = float(points[i]); // points is an array of ints.  
    }
    else
    {
        cvpoints[i/2].y = float(points[i]);
    }
}

И когда вы закончите с ними, вы освободите память:

free(cvpoints);
0 голосов
/ 19 марта 2011

Вы просто создаете указатели, но вам нужно, чтобы они указывали на что-то в памяти!

Пример:

struct CvPoint2D32f *cvpoint = (struct CvPoint2D32f *)malloc(sizeof(struct CvPoint2D32f));
if (cvpoint == NULL) {
    //malloc error
}
0 голосов
/ 19 марта 2011

На что указывают эти указатели? Я думаю, что вы хотите сделать, это выделить динамическую память для структур, но я не вижу никакого выделения памяти в вашем коде. В настоящее время все указатели указывают на неопределенную память, поэтому, конечно, это не удастся.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...