如何为二维动态数组赋值?

时间:2015-07-31 13:54:41

标签: c arrays dynamic-arrays

我发现问题是分段,程序收到信号SIGSEGV。 该程序比这复杂得多,但这些是这些阵列受影响的唯一点。

尝试打印或为Inputarray和Outputarray指定值时,程序崩溃而不显示任何错误。

我创建了一个只执行该操作的程序并且它工作正常,因此我不知道是什么导致了这个问题,所以我决定将所有代码都放到那一点。

程序在我已经包含了EXCLAMATION MARKS的循环中崩溃。

到目前为止一切正常。当我查找类似的案例时,我发现所有人都使用不同的函数来分配他们的数组,我不明白它与我的问题有什么关系。最奇怪的是我用这个创建了另一个程序,似乎工作了谢谢你的帮助!!

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

int main()
{
    FILE*Results_ptr;
    int* WaveguideConfig;
    double* itta;
    double** InputArray;
    double** GateArray;
    double** OutputArray;
    double** ProbabilityArray;
    double Final[21];
    double Error, ErrorIncrement;
    double j,G,LO;
    int* PhotonArray;
    int i,m,z,o,k,a,c,v,I,M,A,B,C,D,E,F,H,J,K,N,NP,W,V,Z,L,GP,U,WG,ii,jj;

    printf("Enter an integer for the number of entry points:");
    scanf("%d",&N);
    printf("Enter an integer for the number of waveguides:");
    scanf("%d",&WG);
    printf("Enter number of photons:");
    scanf("%d",&NP);

    WaveguideConfig=(int*)malloc(N * sizeof(int*));
    itta=(double*)malloc(N * sizeof(double*));
    InputArray=(double**)malloc(NP * sizeof(double*));
    OutputArray=(double**)malloc(NP * sizeof(double*));

    for(W=0;W<NP;W++)
    {
        InputArray[W]=(double*)malloc(N * sizeof(double));
        OutputArray[W]=(double*)malloc(N * sizeof(double));
    }
    GateArray=(double**)malloc(N * sizeof(double*));
    ProbabilityArray=(double**)malloc(N * sizeof(double*));

    for(Z=0;Z<N;Z++)
    {
        GateArray[Z]=(double*)malloc(N * sizeof(double));
        ProbabilityArray[Z]=(double*)malloc(N * sizeof(double));
    }

    Results_ptr=fopen("Results.txt","w");
    printf("Enter configuration of the waveguides:");
    scanf("%d %d %d %d %d %d %d", &WaveguideConfig[0], &WaveguideConfig[1], &WaveguideConfig[2], &WaveguideConfig[3], &WaveguideConfig[4], &WaveguideConfig[5], &WaveguideConfig[6]);
    printf("Enter the corresponding values of reflectivity:");
    scanf("%lf %lf %lf %lf %lf %lf %lf",&itta[0],&itta[1],&itta[2],&itta[3],&itta[4],&itta[5],&itta[6]);
    PhotonArray=malloc(NP * sizeof(int));
    printf("Enter photon entry points:");
    scanf("%d %d", &PhotonArray[0], &PhotonArray[1]);
    printf("Enter error in reflectivity:");
    scanf("%lf",&Error);
    ErrorIncrement=Error/10;

    for(H=0;H<10;H++)
    {
        for(GP=0;GP<NP;GP++)
        {
            InputArray[GP][PhotonArray[GP]]=1;
        }
        C=0;
        E=0;
        C=0;
        G=0;
        for(k=0;k<WG;k++)
        {
            for(m=0;m<N;m++)
            {
                for(z=0;z<N;z++)
                {
                    if(z==m)
                    {
                        GateArray[m][z]=1;
                    }
                    else
                    {
                        GateArray[m][z]=0;
                    }
                }
            }
            GateArray[WaveguideConfig[k]][WaveguideConfig[k]]=sqrt(itta[k]+H*ErrorIncrement);
            GateArray[WaveguideConfig[k]][WaveguideConfig[k]+1]=sqrt(1-itta[k]+H*ErrorIncrement);
            GateArray[WaveguideConfig[k]+1][WaveguideConfig[k]]=sqrt(1-itta[k]+H*ErrorIncrement);
            GateArray[WaveguideConfig[k]+1][WaveguideConfig[k]+1]=-sqrt(itta[k]+H*ErrorIncrement);
            for(I=0;I<N;I++)
            {
                for(M=0;M<N;M++)
                {
                    if(M==(N-1))
                    {
                        if(I==(N-1))
                        {
                            printf("%lf\n\n", GateArray[I][M]);
                        }
                        else
                        {
                            printf("%lf\n", GateArray[I][M]);
                        }
                    }
                    else
                    {
                        printf("%lf\t", GateArray[I][M]);
                    }
                }
            }
            for(L=0;L<NP;L++)//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
            {
                for(i=0;i<N;i++)
                {
                    for(o=0;o<N;o++)
                    {
                        OutputArray[L][i]+=GateArray[i][o]*InputArray[L][o];
                        printf("%lf", OutputArray[L][i]);
                    }
                }
            }//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!`
        }
    }
}

2 个答案:

答案 0 :(得分:0)

我看到循环中没有错误。访问的所有数组都已正确分配并具有正确的大小。

但是,从不检查scanf的返回值,并且不读取预期值会导致使用单位化变量(具有随机值)。

使用:

    printf("Enter an integer for the number of entry points:");
    if (scanf("%d",&N) != 1) {printf("Invalid input\n"); return(1);}

我不是扫描大师,但经常看到使用前导空格来跳过缓冲区中的任何空格:

    printf("Enter an integer for the number of waveguides:");
    if (scanf(" %d",&WG)!=1) {printf("Invalid input\n"); return(1);}

修改 ..来自malloc的返回值都不是。因此,使用具有意外大且随机值的单元化变量(因为scanf失败)会让malloc失败,因为请求的内存太多。因此,我希望在您的循环内存不会访问程序,内存管理器将其标记为非法并中止该程序。

答案 1 :(得分:0)

我看到的第一个问题是:

printf("Enter an integer for the number of entry points:");
scanf("%d",&N);
...
WaveguideConfig=(int*)malloc(N * sizeof(int*));
itta=(double*)malloc(N * sizeof(double*));
...
printf("Enter configuration of the waveguides:");
scanf("%d %d %d %d %d %d %d", &WaveguideConfig[0], &WaveguideConfig[1], &WaveguideConfig[2], &WaveguideConfig[3], &WaveguideConfig[4], &WaveguideConfig[5], &WaveguideConfig[6]);
printf("Enter the corresponding values of reflectivity:");
scanf("%lf %lf %lf %lf %lf %lf %lf",&itta[0],&itta[1],&itta[2],&itta[3],&itta[4],&itta[5],&itta[6]);

您专门为WaveguideConfigitta读取了7个数组值,但是如果输入的值N小于7,则表示您没有分配足够的内存对于那些数组并写入已分配内存的末尾。

接下来是:

printf("Enter number of photons:");
scanf("%d",&NP);
...
PhotonArray=malloc(NP * sizeof(int));
printf("Enter photon entry points:");
scanf("%d %d", &PhotonArray[0], &PhotonArray[1]);
printf("Enter error in reflectivity:");
....
for(H=0;H<10;H++)
{
    for(GP=0;GP<NP;GP++)
    {
        InputArray[GP][PhotonArray[GP]]=1;
        ...

如果输入NP大于2的值,则只会初始化PhotonArray中的前两项。因此,GP大于1时,PhotonArray[GP]未定义,因此InputArray[GP][PhotonArray[GP]]可能指向数组末尾。

还有比这更多的事情。通过valgrind运行你的代码,这将告诉你何时超越你的记忆界限。