C:使用带有变量数组的结构时出错

标签 c struct malloc

我有一个这样的结构:

typedef struct tgPoligono {
    int numero_de_lados;
    CvPoint** cantos;
    float* lados;
    double* angulos;
} *tgPoligono;

在一个函数中,我像这样使用它:

tgPoligono criar_tgPoligono(CvSeq* poligono){
    int i;
    tgPoligono tg_poligono = (tgPoligono) malloc(sizeof(tgPoligono));

    tg_poligono->numero_de_lados = poligono->total;

    tg_poligono->cantos = (CvPoint**) malloc(tg_poligono->numero_de_lados * sizeof(CvPoint*));
    for(i= 0; i < tg_poligono->numero_de_lados; i++){
        tg_poligono->cantos[i] = (CvPoint*)cvGetSeqElem(poligono, i);
    }

    tg_poligono->lados = (float*) malloc(tg_poligono->numero_de_lados * sizeof(float));
    tg_poligono->angulos = (double*) malloc(tg_poligono->numero_de_lados * sizeof(double));
    double* angulos = (double*) malloc(tg_poligono->numero_de_lados * sizeof(double));
    for(i = 0; i < tg_poligono->numero_de_lados; i++){
        CvPoint* pt_0 = tg_poligono->cantos[((i == 0)?(tg_poligono->numero_de_lados - 1):(i - 1))];     //Canto anterior
        CvPoint* pt_1 = tg_poligono->cantos[i];                                                         //Canto atual
        CvPoint* pt_2 = tg_poligono->cantos[(i + 1) % tg_poligono->numero_de_lados];                    //Canto seguinte

        //Calculo a distancia entre dois cantos, o que retorna o comprimento do lado do poligono
        tg_poligono->lados[i] = sqrt(((pt_1->x - pt_2->x)*(pt_1->x - pt_2->x)) + ((pt_1->y - pt_2->y)*(pt_1->y - pt_2->y)));

        //Calculo o cosseno do angulo correspondente ao ponto atualmente avaliado
        tg_poligono->angulos[i] = cosseno(pt_0, pt_2, pt_1);
        angulos[i] = cosseno(pt_0, pt_2, pt_1);
    }

    return tg_poligono;
}

好的,我的问题是 tg_poligono->angulos tg_poligono->lados 工作正常,但 tg_poligono->angulos 显然没有任何原因失败!

当我在程序中使用 de 函数(在 for 语句内)时,上面的代码会运行一段时间,然后失败且没有任何消息。

如果我注释以下几行,则程序可以正常工作,没有错误:

tg_poligono->angulos = (double*) malloc(tg_poligono->numero_de_lados * sizeof(double));
...
tg_poligono->angulos[i] = cosseno(pt_0, pt_2, pt_1);

如果您查看我的代码,您会看到我所做的测试:

double* angulos = (double*) malloc(tg_poligono->numero_de_lados * sizeof(double));
...
angulos[i] = cosseno(pt_0, pt_2, pt_1);

它是同样的事情,但不使用结构并且工作正常。

ps.:我在这段代码上使用了opencv函数,但这与问题无关。 函数 cosseno(pt_0, pt_2, pt_1) 工作正常,我确信这一点。 这是 C 代码,我不能使用 C++。

最佳答案

我认为这就是您想要定义结构的方式:

typedef struct _tgPoligono {
    int numero_de_lados;
    CvPoint** cantos;
    float* lados;
    double* angulos;
} tgPoligono;

tgPoligono criar_tgPoligono(CvSeq* poligono){
    int i;
    tgPoligono *tg_poligono = (tgPoligono*) malloc(sizeof(tgPoligono));

etc...

请注意从结构定义和 typedef 末尾删除了星号。我认为这就是让你感到困惑的地方。

关于C:使用带有变量数组的结构时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7820818/

相关文章:

c - 文件 IO : Line by Line Comparison In C, 段错误

C - 用低位宏显示字符串

C内存分配

c - 对结构使用 malloc 时出错

c++ - 将结构写入和读取文件

ios - 更新已保存的 Codable 结构以添加新属性

c - 如何修复 'Use of uninitialised value' 以及如何找到泄漏位置?

c - main 的三个参数和其他混淆技巧

c++ - winsock中使用的FAR和FAR *的区别

c - 结构的字段是否算作变量?数组的元素算作变量吗?