free()导致SEG故障C.

时间:2015-12-21 14:06:13

标签: c malloc free

int ** ARR;
int LENGTH = 1;
int DEPTH = 1;

void loadt(int ** terr)
{
    terr = (int**)malloc(sizeof(int*) * (LENGTH + 1));
    int i, j;
    for(i = 1; i <= LENGTH; i++)
        terr[i] = (int*)malloc(sizeof(int) * (DEPTH + 1));
    for(i = 1; i <= LENGTH; i++)
        for(j = 1; j <= DEPTH; j++)
            scanf("%d", &terr[i][j]);
}
void freet(int ** terr)
{
    int i;
    for(i = 1; i <= LENGTH; i++){
        free(terr[i]);
    }
    free(terr);
}

int main(int argc, char* argv[])
{
    loadt(ARR);
    freet(ARR);  
    return 0;
}

您好。我可能会错过这里非常基本的但是在我运行程序之后它会崩溃。“分段错误(核心转储)”为什么?

1 个答案:

答案 0 :(得分:4)

因为在函数的参数总是通过值传递,所以你的不必要的全局变量不会在函数内部重新分配,因为你将它作为参数传递,因此它的副本被创建,这是实际重新分配的那个。

所以你在未经初始化的poitner上调用free()

试试这个

int **loadt(int LENGTH, int DEPTH)
{
    int **terr;
    int i, j;
    terr = malloc(sizeof(int*) * (LENGTH + 1));
    if (terr == NULL)
        return NULL;
    for (i = 1; i <= LENGTH; i++) {
        terr[i] = malloc(sizeof(int) * (DEPTH + 1));
        if (terr[i] == NULL) {
            for (j = i ; j >= 0 ; --j) {
                free(terr[j]);
            }
            free(terr);
            return NULL;
        }
    }
    for (i = 1; i <= LENGTH; i++) {
        for (j = 1; j <= DEPTH; j++) {
            scanf("%d", &terr[i][j]);
        }
    }
    return terr;
}

void freet(int **terr)
{
    int i;
    if (terr == NULL)
        return; // `free()' also accepts NULL pointers
    for (i = 1; i <= LENGTH; i++) {
        free(terr[i]);
    }
    free(terr);
}

int main(int argc, char* argv[])
{

    int **ARR;
    int LENGTH = 1;
    int DEPTH = 1;

    ARR = loadt(LENGTH, DEPTH);
    freet(ARR);  
    return 0;
}

另一个问题是,你在i = 1开始你的循环,这很好,因为你分配了足够的空间,但这不是你应该这样做的方式。相反for (i = 0 ; i < LENGTH ; ++i)将成为程序员如何做到的。请注意,您浪费了数组的第一个元素。