在C中,内存分配失败,为什么?

时间:2014-06-09 16:15:27

标签: c

int x;
int komsuSayisi;//adjanceny matrix
int **arkadas;
int t;
int komsu[24][24];

scanf("%d",&t);
**arkadas = (int **)malloc( t*sizeof( int* )); //allocating rows
for(i=0; i<t; i++)
{
    x=0;
    arkadas[i] = (int *)malloc( t*sizeof(int) ); //allocating cow temporarily
    for(j=0; j<t; j++)
    {
        komsu[i][j]=fark(kelime[i],kelime[j]); //fark returns 1 or 0.
        //so i put those 1 ones to another matrix,arkadas
        if(komsu[i][j]==1){
            komsuSayisi++;
            arkadas[i][x]=j;
            x++;
        }
        arkadas[i] = (int *) realloc(arkadas[i], x);
        //real allocating here
    }

它给错误和关闭。没有错。我想要的是adjanceny太大而无法搜索,因此我将使用此矩阵轻松搜索"1"个。

2 个答案:

答案 0 :(得分:5)

**arkadas = (int **)malloc( t*sizeof( int* ));

应该是

arkadas = malloc( t*sizeof( int* ));

**arkadas取消引用未初始化的指针,导致您尝试写入不可预测的地址。你没有在这个地址拥有内存,因此尝试写入它是不安全的。

第二种形式将指针数组的地址分配给局部变量arkadas;这是需要做的。

稍后在您的计划中

if(komsu[i][j]==1){
    komsuSayisi++;
    arkadas[i][x]=j;
    x++;
}
arkadas[i] = (int *) realloc(arkadas[i], x);
if条件内的

代码尝试在分配之前写入arkadas[i]。这也会调用未定义的行为并且可能会崩溃。您可以通过删除行arkadas[i][x]=j;并交换realloc malloc realloc来调用if(komsu[i][j]==1){ komsuSayisi++; x++; } arkadas[i] = malloc(x*sizeof(int)); 来调用{{1}}之前,您可以避免崩溃。

{{1}}

答案 1 :(得分:1)

我看到了

 komsuSayisi++;

您没有粘贴整个代码,但可能就是崩溃您的程序...我没有看到在该增量之前的任何初始化....

这加上在其他答案上发布的分歧