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

时间:2014-01-18 12:24:20

标签: c++ arrays malloc

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

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: %d\n",edge);

    free(niz);
    return 0;
}

2 个答案:

答案 0 :(得分:2)

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

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

应该是

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

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

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

Do I cast the result of malloc?

答案 1 :(得分:2)

您正在使用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索引),这些元素具有未定义的行为。