如何为结构分配指针数组

时间:2011-03-18 22:38:28

标签: c

我正在使用opencv的CvPoint2D32f结构,它被定义为

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 个答案:

答案 0 :(得分:5)

你有一个指向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 :(得分:1)

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);

答案 2 :(得分:0)

这些指针指向哪里?我想你想要做的是为结构分配动态内存,但我没有在你的代码中看到任何内存分配。目前所有指针都指向未定义的内存,因此当然会失败。

答案 3 :(得分:0)

你只是在创建指针,但你需要它们指向内存中的东西!

示例:

struct CvPoint2D32f *cvpoint = (struct CvPoint2D32f *)malloc(sizeof(struct CvPoint2D32f));
if (cvpoint == NULL) {
    //malloc error
}