使用2D数组的空指针异常

时间:2014-07-30 09:09:53

标签: c nullpointerexception

我认为在任何地方都有一个空指针异常,但我找不到它。这是我的代码:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <Windows.h>
#include <string>
#include <vector>

using namespace std;
int a = GetPrivateProfileInt("general","X",10,"./test.ini");
int b = GetPrivateProfileInt("general","Y",10,"./test.ini");

void random_array(int **A, int X, int Y) {...}
void array_anzeigen(int **arr, int X, int Y) {...}
void neues_array(int **A, int X, int Y)
{
    int **array1=NULL;
    array1 = (int **) malloc(a*sizeof(int *));
    for (int i=0;i<a;i++)
        array1[i] = (int *) malloc(b*sizeof(int));
    const int S = sizeof(array1);
    const int T = sizeof(array1);

    int temp[S][T];
    for(int i = 0; i < Y; i++)
    {
        for(int j = 0; j < X; j++)
        {
            temp[i][j] = A[i][j];
        }
    }

    int maske[S][T];
    for(int i = 0; i < Y; i++)
    {
        for(int j = 0; j < X; j++)
        {
            maske[i][j] = 0;
        }
    }

    for(int i = 0; i < Y; i++)
    {
        for(int j = 0; j < X; j++)
        {
            if(temp[i-1][j-1] == 1 && i     > 0 && j     > 0) ++maske[i][j];
            if(temp[i  ][j-1] == 1              && j     > 0) ++maske[i][j];
            if(temp[i-1][j  ] == 1 && i     > 0             ) ++maske[i][j];
            if(temp[i-1][j+1] == 1 && i     > 0 && j + 1 < X) ++maske[i][j];
            if(temp[i  ][j+1] == 1              && j + 1 < X) ++maske[i][j];
            if(temp[i+1][j  ] == 1 && i + 1 < Y             ) ++maske[i][j];
            if(temp[i+1][j-1] == 1 && i + 1 < Y && j     > 0) ++maske[i][j];
            if(temp[i+1][j+1] == 1 && i + 1 < Y && j + 1 < X) ++maske[i][j];

            if(maske[i][j] > 3 || maske[i][j] < 2)
                A[i][j] = 0;
            else if(maske[i][j] == 3)
                A[i][j] = 1;
        }
    }
}

int main()
{
    int **array1=NULL;
    array1 = (int **) malloc(a*sizeof(int *));
    for (int i=0;i<a;i++)
        array1[i] = (int *) malloc(b*sizeof(int));

    const int X = a;
    const int Y = b;

    srand((unsigned int) time(NULL));
    random_array(array1, X, Y);

    int runde = 1;
    while(getchar())
    {
        neues_array(array1, X, Y);
        printf(" Runde %i\n", runde);
        array_anzeigen(array1, X, Y);

        ++runde;
    }

    return 0;

}

VB2012说,例外情况如下:

for(int i = 0; i < Y; i++)
{
    for(int j = 0; j < X; j++)
    {
        temp[i][j] = A[i][j];
    }
}

我是德国人,我的书面英语很糟糕,但我想,你了解我。

1 个答案:

答案 0 :(得分:1)

S和T具有相同的值,因为您使用sizeof(array1)初始化它们。 但是不同维度的大小由变量a和b给出,您应该使用它来定义数组。否则你就会走出数组边界。