C中内存中的未知错误

时间:2010-03-22 17:12:33

标签: c arrays dynamic memory-management

我有一个2D动态数组。 我在一行后面输入一个0号线,其编号最大:

void InsertZero(int **a, int pos){
    int i, j;
    a = (int**)realloc(a, n * sizeof(*a));
    a[n-1] = (int*)calloc(n, sizeof(**a));
    d = 0;
    for(i = n-1; i > pos; i--){
        for(j = 0; j < n; j++){
            a[i][j] = a[i-1][j];
            printf("%d ", a[i][j]);
        }
    }

    for(i = 0; i < n; i++){
        a[pos][i] = 0;
    }
}

如果我制作阵列3,5,7,9的大小......它可以正常工作。但是,如果有多行是2,4,6,......,那么当我尝试打印我的数组时,这是一个访问冲突错误:

void Print(void){
    int i, j;
    for(i = 0; i < (n-d); i++){
        for(j = 0; j < n; j++){
            printf("%d\t", arr[i][j]);
        }
        printf("\n");
    }
}

代码:http://codepad.org/JcUis6W4

2 个答案:

答案 0 :(得分:0)

看着这个我无法理解......看看评论1,你有n设置到realloc某个内存区块a类型为{int ** 1}} - 一个双指针,你怎么调用这个函数?其次,评论2,为什么在先前调用双指针上的calloc时调用realloc?假设n的值为5,则realloc在双指针a上调用,意味着a[0][1]..a[4][1],现在calloc被调用a[4]有一个新的记忆块...

void InsertZero(int **a, int pos){
    int i, j;

    /* 1. */
    a = (int**)realloc(a, n * sizeof(*a)); 
    /* Bzzzzt....if realloc failed, a gets overwritten! */

    /* 2. */
    a[n-1] = (int*)calloc(n, sizeof(**a));

    /* 3. */
    d = 0;

    /* 4. */
    for(i = n-1; i > pos; i--){
        for(j = 0; j < n; j++){
            a[i][j] = a[i-1][j];
            printf("%d ", a[i][j]);
        }
    }

    for(i = 0; i < n; i++){
        a[pos][i] = 0;
    }
}

评论3,d用于什么 - 无用变量? 注释4,如果[0][0]的值为5,则假设内存块具有数组下标[4][4]n

你能澄清这一切吗?

修改:再次查看...当a的来电失败时,realloc可能会被覆盖!我建议使用此部分代码来抵消此

    int **tmpA;
    tmpA = (int**)realloc(a, n * sizeof(*a)); 
    if (tmpA != NULL){
        a = tmpA;
        ....
        a[n-1] = (int*)calloc(n, sizeof(**a));
        for(i = n-1; i > pos; i--){
            .... 
        }

        for(i = 0; i < n; i++){
            ....
        }
    }   

答案 1 :(得分:0)

在您的函数InsertZero中,您有一个局部变量a。该局部变量最初设置为指向整数的指针的地址(您可能需要指向整数数组的指针的地址,即int ***a)。

当您致电realloc时,您正在为a指定一个指向内存块的指针的本地副本,但是一旦您完成了您的功能,您的本地副本a完全可能1}}指向与程序其余部分不同的地方。你可能想说*a = (int **)realloc(a, n * sizeof(int *));

危险的是,你正在使用未传递给你的函数的n。您似乎已经假设n将比之前的数组大小大1 - 否则您对calloc的调用是多余的,您只是旋转数组,让最后一个元素因内存泄漏而中断。

让我们使用一个更简单的例子,没有数组,没有维度。假设你想创建一个函数:

void make_me_a_pointer( int **mynumber ) {
    *mynumber = (int *)malloc( sizeof(int) );
    **mynumber = 7; /* assign the value 7 to my allocated memory */
}

int main( void ) {
    int *demoint;
    make_me_a_pointer( &demoint );
    printf( "Magic num is %d\n", *demoint );
}

但是在您的情况下,您只是分配了a = realloc ...因此从未在您的职能范围之外传达a的新地址。