在数组中使用比分配的元素更多的元素具有未定义的行为



我有三角形的结构,用户必须输入他想要的三角形数量,然后为每个三角形填充数据 - 边的长度。然后程序以最大的长度写入边缘。 首先,我为三角形数组分配内存,然后用数据填充每个三角形,但我的程序从未将最后输入的三角形保存在数组中,并且我得到一些奇怪的数字作为最大边缘。这是我的代码

struct triangle
{
    int a;
    int b;
    int c;
};
int getBiggestEdge(int a, int b, int c)
{
    int max = a;
    if(b>max) {max=b;}
    if(c>max) {max=c;}
    return max;
}
int maxEdge(struct triangle niz [], int br)
{
    int i, najduza;
    najduza = getBiggestEdge(niz[0].a, niz[0].b, niz[0].c);
for(i=1; i<=br; i++)
{
    if(getBiggestEdge(niz[i].a, niz[i].b, niz[i].c) > najduza)
    {
        najduza = getBiggestEdge(niz[i].a, niz[i].b, niz[i].c);
    }
}
return najduza;
}
int main()
{
    int i, n, edge;
    struct triangle* niz;
    printf("Insert number of triangles: ");
    scanf("%d", &n);
    niz= (struct triangle*) malloc(n * sizeof(struct triangle));
    if (niz == NULL) 
    { 
        printf("Error!");
        return 0;
    }
    printf("Insert data for every triangle (a b c):n");
    for(i=0;i<n;i++)
    {
        printf("Triangle: ");
        scanf("%d %d %d", &niz[i].a, &niz[i].b, &niz[i].c);
    }
    edge = maxEdge(niz, n);
    printf("Biggest edge is: %dn",edge);
    free(niz);
    return 0;
}

您使用 malloc(n * sizeof(struct triangle))为 n 个数组元素分配空间,并使用以下内容为 n 个元素获取输入:

for(i=0;i<n;i++)

但通过以下方式访问 N+1 元素:

for(i=1; i<=br; i++)

maxEdge.这里br的值为 n ,因此代码访问 n+1 个元素(从 0 到 n 索引),这些元素具有未定义的行为。

您在maxEdge中使用了错误的索引:

for(i=1; i<=br; i++)

它应该是

for(i = 0; i < br; i++)

在主循环中,您正确地使用了它,但在函数中,您正在读取数组边界之外并获取未定义的数据。

不相关但值得一提的是,您不应该强制转换 malloc 返回的指针:

我是否施放了马洛克的结果?

相关内容

  • 没有找到相关文章

最新更新