【问题标题】:Struct initialized in function behaving weirdly在函数中初始化的结构表现得很奇怪
【发布时间】:2014-01-06 14:35:48
【问题描述】:

在我的项目中,我创建了 3 种不同的 typedef struct 类型:

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

typedef struct Triangle 
{ 
    Point A; 
    Point B;
    Point C;
    unsigned char color[3];//RGB
} Triangle;

typedef struct Structure 
{ 
    Triangle* triangles; 
    unsigned int nt; //number of triangles in array
} Structure;

您可能已经注意到,Structure 类型有一个动态大小的 Triangles 数组,所以我还将在这里发布内存分配和释放函数:

Structure newStructure(unsigned int nt)
{
    Structure S;
    Triangle* tri = malloc ((nt) * sizeof(Triangle));
    if (tri!=NULL) 
    {
        S.triangles = tri;
        S.nt = nt;
    }
    else S.nt = 0;
    return S;
}

void delStructure (Structure S) 
{
    if (S.triangles != NULL) free (S.triangles);
}

然后我想创建一个函数,使用以下语法将Triangle 添加到当前的StructureS = addTriangle(T,S)。这就是我所拥有的:

Structure addTriangle(Triangle T, Structure S)
{

    Structure R = newStructure(S.nt+1);
    int i=0;

    while(i++<S.nt) R[0].triangles[i] = S.triangles[i];
    R[0].triangles[S.nt] = T;

    delStructure(S); //Is this necessary?

    return R[0];
}

编译时不显示错误消息,但是当我使用该函数时,数组上的第一个 Triangle 会获得随机值。 更清楚地说,如果我在数组中有一个Structure S 和三角形T1T2,然后我使用S = addTriangle(T3,S),结果将是一个Structure 和以下Triangles 数组: {T?,T2,T3},其中T? 显然具有随机值。

为什么会这样?

【问题讨论】:

    标签: c function struct


    【解决方案1】:
    while(i++<S.nt) R[0].triangles[i] = S.triangles[i];
    

    应该是这样的

    for (i=0; i<S.nt; i++) {
        R.triangles[i] = S.triangles[i];
    }
    

    目前,您跳过分配R.triangles 的第一个元素,并通过读取S.triangles 的末尾以外的内容分配其倒数第二个元素。您可以通过推迟递增 i 直到每个循环结束来解决此问题。 (您可以使用while 循环继续执行此操作;我发现for 循环更清晰。)

    此外,R[0] 的所有使用都可以(应该)被R 替换。 R 是单个结构,而不是数组。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-17
      • 2013-12-17
      • 2014-02-05
      • 2013-02-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多