Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C中内存中存在未知错误_C_Arrays_Dynamic_Memory Management - Fatal编程技术网

C中内存中存在未知错误

C中内存中存在未知错误,c,arrays,dynamic,memory-management,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++){

我有一个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");
    }
}

代码:

看着这个,我无法理解。。。。看看注释1,您已经在某个地方设置了realloc一个内存块,该内存块的类型是int**-一个双指针,您如何调用该函数?第二,注释2,为什么在以前调用双指针上的realloc时调用calloc。。。?假设n的值为5,则在双指针a上调用realloc,表示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; } } 在函数InsertZero中有一个局部变量a。这个局部变量最初是用指向整数的指针的地址设置的,您可能想要指向整数数组的指针的地址,即int***a

调用realloc时,您将指针的本地副本分配给内存块,但一旦完成函数,指针的本地副本完全可能指向与程序其余部分不同的地方。您可能想说*a=int**realloca,n*sizeofint*

危险的是,您正在使用未传递给函数的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。。。因此,从未向职能部门以外的部门传达过新地址。

谢尔盖,让我们更详细地谈谈错误。您得到的输出是什么?您期望的输出是什么?当我尝试读取[0][0]并且我的数组由2,4,6,8,。。。在我看来,除了[n-1]之外,您永远不会初始化任何一个条目。所以我不知道在哪里设置n,在哪里调用InsertZero,但我假设您需要研究这个方向,或者在这里发布代码。当我有n-1行和n列时,我使用d,但在插入新行后,我有n行和列。代码:哪个打印调用失败?第一次调用?1 a有n-1个元素,我用realloc 2a[n-1]生成n个元素,我调用一个新内存。3我有n-1行和n列。d=1,n-d等于n-1。当我添加一个新行时,我将d=0,n行和n列4我知道试着写一些简单的测试代码,Sergey,让自己在跳入多维数组和内存分配的深层之前熟悉指针……PP的想法是正确的。在Sergey的程序中,arr、n和d是全局变量。arr被分配指向CreateArray中分配的指针数组的指针,但正如PP所指出的,稍后当您realloc时,您永远不会将结果分配给全局arr。我猜当n为偶数时,realloc必须将块移到其他位置,因此arr最终指向已释放的内存。您必须检查*alloc的报税表。此调用可能失败并返回NULL。您的程序应该处理这个问题,可能会以错误消息结束。使用有意义的变量名,避免使用全局变量。
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 );
}