c访问分配内存的函数时程序崩溃

时间:2014-10-23 16:21:33

标签: c arrays c89 memory-corruption

我编写了c程序,它读取方阵的数字并将它们存储在2d动态数组中以便稍后找到某些特定点。现在,一切都很顺利,直到我收到将所有存储的数字移动到新的1d动态数组的任务。此时,程序在尝试访问分配新数组内存并向其移动数字的函数时崩溃。因为我不仅是新手,而且是整体编程,任何反馈都会受到赞赏。

现在这是应该分配新数组

的内存的函数
void perkelimas(int ***matrica, int *n, int **matrica2)
{
    int naujas_dydis = (*n)*(*n);
    printf("%i dydis \n", naujas_dydis);
    *matrica2 = malloc(naujas_dydis*sizeof(int));
    int w;
    int b = 0;
    int c = 0;
    for(w = 0; w < naujas_dydis; w++)
    {

    printf("%i \n", w);
    printf("b = %i, c = %i \n", b, c);


    if(c < *n)
    {
       *matrica2[w] = *matrica[b][c];
       printf("%i \n", *matrica2[w]);
        c++;
    }

    if  (c == *n)
    {
        c = 0;
        b++;
    }
}

}

这是主要功能

int main()
{
    int *n;
    int i,j;
    int **matrica;
    int *matrica2 = NULL;
    atmintis(&matrica, n);
    i = 0;
    j = 0;
    int k = 0;
    while(i < *n)
    {
        while(j < *n)
        {
            printf("iveskite tasko dydi: \n"); // this is where user inputs matrix numbers
            scanf("%i", &matrica[i][j]);
            j++;
        }
        i++;
        j = 0;
    }
    i = 0;
    j = 0;
    int m = 0;
    int l = 0;
    printf("matrica: \n");
    while (l < *n)
    {
        while (m < *n)
        {
            printf("%i", matrica[l][m]);
            printf(" ");
            m++;
        }
        printf("\n");
        m = 0;
        l++;
    }
    printf("\n");
    printf("balno tasku koordinates: \n");
    while (i < *n)
    {
        while (j < *n)
        {
            int x,y;
            x = j+1;
            y = i+1;
            if(tikrinimas(i, j, *n, matrica) == 1)
            {
                printf("%i", x);
                printf(" ");
                printf("%i", y);
                printf("\n");
            }
            j++;
        }
        j = 0;
        i++;
    }

    perkelimas(matrica, n, matrica2);

    for(i = 0; i < *n; i++)
    {
        free(matrica[i]);
    }

    return 0;
}

这里是分配2d数组内存的函数

void atmintis(int ***matrica, int *n)
{
    printf("Iveskite matricos ilgi ir ploti: ");
    scanf("%i", &(*n)); // length and width of matrix
    int q;
    (*matrica) = (int**)malloc((*n)*sizeof(int));
    for (q = 0 ; q < *n ; q++)
    {
        (*matrica)[q] = (int*)malloc((*n)*sizeof(int));
    }
}

提前感谢您提供任何帮助

1 个答案:

答案 0 :(得分:0)

有一些事情需要修改:

  • 正如@rodrigo所指出的sizeof(int*)可能与sizeof(int)不同,例如在64位平台上。

  • nint*,指向int的指针,指向某处。这个地方永远不会分配。这会导致未定义的行为。它可能会触发分段错误。为防止出现这种情况,n可以是int,函数使用&n,指向n

  • 函数perkelimas()需要指向2D矩阵的指针和指向数组的指针。 perkelimas(matrica, &n, matrica2);应为perkelimas(&matrica, &n, &matrica2);

  • 在函数perkelimas()中,可以添加brakets: (*matrica2)[w] = (*matrica)[b][c];

  • free(matrica)free(matrica2)

以下是代码:

#include <stdio.h>
#include <stdlib.h>

void atmintis(int ***matrica, int *n)
{
    printf("Iveskite matricos ilgi ir ploti: ");
    scanf("%i", &(*n)); // length and width of matrix
    int q;
    (*matrica) = (int**)malloc((*n)*sizeof(int*));
    for (q = 0 ; q < *n ; q++)
    {
        (*matrica)[q] = (int*)malloc((*n)*sizeof(int));
    }
}

void perkelimas(int ***matrica, int *n, int **matrica2)
{
    int naujas_dydis = (*n)*(*n);
    printf("%i dydis \n", naujas_dydis);
    *matrica2 = malloc(naujas_dydis*sizeof(int));
    int w;
    int b = 0;
    int c = 0;
    for(w = 0; w < naujas_dydis; w++)
    {

        printf("%i \n", w);
        printf("b = %i, c = %i \n", b, c);


        if(c < *n)
        {
            (*matrica2)[w] = (*matrica)[b][c];
            printf("%i \n", (*matrica2)[w]);
            c++;
        }

        if  (c == *n)
        {
            c = 0;
            b++;
        }
    }
}

int main()
{
    int n;
    int i,j;
    int **matrica;
    int *matrica2 = NULL;
    atmintis(&matrica, &n);
    i = 0;
    j = 0;
    int k = 0;
    while(i < n)
    {
        while(j < n)
        {
            printf("iveskite tasko dydi: \n"); // this is where user inputs matrix numbers
            scanf("%i", &matrica[i][j]);
            j++;
        }
        i++;
        j = 0;
    }
    i = 0;
    j = 0;
    int m = 0;
    int l = 0;
    printf("matrica: \n");
    while (l < n)
    {
        while (m < n)
        {
            printf("%i", matrica[l][m]);
            printf(" ");
            m++;
        }
        printf("\n");
        m = 0;
        l++;
    }
    printf("\n");
    printf("balno tasku koordinates: \n");
    while (i < n)
    {
        while (j < n)
        {
            int x,y;
            x = j+1;
            y = i+1;
            /*     if(tikrinimas(i, j, *n, matrica) == 1)
            {
                printf("%i", x);
                printf(" ");
                printf("%i", y);
                printf("\n");
            }*/
            j++;
        }
        j = 0;
        i++;
    }

    perkelimas(&matrica, &n, &matrica2);

    for(i = 0; i < n; i++)
    {
        free(matrica[i]);
    }
    free(matrica);
    free(matrica2);
    return 0;
}

通过将指针传递给int n和指向2D矩阵matrica的指针来执行分配,您做得很好:此函数将修改nmatrica的值。函数void perkelimas(int ***matrica, int *n, int **matrica2)不是这种情况:此函数不会修改matrican。所以void perkelimas(int **matrica, int n, int **matrica2)就足够了。由于matrica2被修改(在此处分配),因此需要将指针传递给数组matrica2