最后一次迭代时的分段错误

时间:2016-01-24 03:28:00

标签: c

我试图用值随机填充二维数组,然后将它们相乘,但由于某些奇怪的原因,当我运行我的代码时,在最后一次迭代中,我得到一个分段错误。我试过减少我传递它的数量和一切,但故障仍然存在。这是我正在尝试执行的代码,非常感谢任何帮助,谢谢。

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

int main(int argc, char *argv[])
{ 

    FILE *matrixFile;
    int n = atoi(argv[1]);  // the number of matrices
    int i, j;   // must declare outside of for loop due to resolve C99 mode error
    double arrA[n][n];// = CreateRandomMatrix(n);
    double arrB[n][n];
    double sumArr[n][n];
    matrixFile  = fopen("home/acolwell/Documents/CPE631_HW2_Number1/results.txt", "w+");

    printf("Usage: %s <size of nxn matrices>\n", argv[1]);

   // randomly populate arrA and arrB
   for(i = 0; i < n; i++)
   {
       printf("%d\n", i);
       for(j = 0; j < n; j++)
       {
           printf("%4d", j);
           arrA[i][j] = (double)rand()/(double)RAND_MAX;
           arrB[i][j] = (double)rand()/(double)RAND_MAX;
       }
    }

    printf("Exiting Matrix randomization");

    // multiply the matrices and write them to the file
    for(i = 0; i < n; i++)
    {
        for(j = 0; j < n; j++)
        {
            sumArr[i][j] = arrA[i][j] * arrB[i][j];
            printf("Writing matrix ");
            fprintf(matrixFile, "%0.3lf\n", sumArr[i][j]);
        }
    }

    if(matrixFile)
    {
        fclose(matrixFile);
    }

    matrixFile = NULL;

   return 0;
}

3 个答案:

答案 0 :(得分:1)

此错误将归结为注销数组的末尾或无法打开文件。我建议运行gdb来检查程序运行时的程序,但是从快速浏览一下我就不知道你是不是想要有

"/home/acolwell/Documents/CPE631_HW2_Number1/results.txt"

作为要写的文件而不是

"home/acolwell/Documents/CPE631_HW2_Number1/results.txt"

我建议在调用fprintf之前检查你的fopen调用的结果。

答案 1 :(得分:1)

如果n足够大,您将使用VLA生成堆栈溢出。我已经通过实验验证了您的代码(例如,使用5000的n)。

因此,您需要使用malloc从堆中分配。但是,这需要进行一些重写。

这是一种使用堆分配的方法,可以获得VLA [使用一些轻微的欺骗]的好处:

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

#define C(_arr) (double (*)[(size_t)(n)]) _arr

void
docalc(FILE *fout,int n,double arrA[n][n],double arrB[n][n],double sumArr[n][n])
{
    // must declare outside of for loop due to resolve C99 mode error
    int i,
     j;

    // randomly populate arrA and arrB
    for (i = 0; i < n; i++) {
        printf("%d\n", i);
        for (j = 0; j < n; j++) {
            printf("%4d", j);
            arrA[i][j] = (double) rand() / (double) RAND_MAX;
            arrB[i][j] = (double) rand() / (double) RAND_MAX;
        }
    }

    printf("Exiting Matrix randomization");

    // multiply the matrices and write them to the file
    for (i = 0; i < n; i++) {
        for (j = 0; j < n; j++) {
            sumArr[i][j] = arrA[i][j] * arrB[i][j];
            printf("Writing matrix\n");
            fprintf(fout, "%0.3lf\n", sumArr[i][j]);
        }
    }
}

int
main(int argc, char *argv[])
{

    FILE *matrixFile;
    int n = atoi(argv[1]);              // the number of matrices

    printf("Usage: %s <size of nxn matrices>\n", argv[1]);

    matrixFile = fopen("/tmp/results.txt", "w+");
    if (matrixFile == NULL) {
        perror("fopen");
        exit(1);
    }

    double *arrA = malloc(sizeof(double) * n * n);
    double *arrB = malloc(sizeof(double) * n * n);
    double *sumArr = malloc(sizeof(double) * n * n);

    docalc(matrixFile,n,C(arrA),C(arrB),C(sumArr));

    if (matrixFile)
        fclose(matrixFile);

    matrixFile = NULL;

    return 0;
}

答案 2 :(得分:0)

我刚编译并测试了您的代码。您提供的文件名不正确;你需要一个&#34; /&#34;在&#34; home&#34;。

之前

不确定要求是什么,但是将矩阵文件写成矩阵:在矩阵的每一行之后添加一个新行&#34;乘以&#34;,而不是在每个元素之后:

for(i = 0; i < n; i++) {
     for(j = 0; j < n; j++) {
         sumArr[i][j] = arrA[i][j] * arrB[i][j];
         printf("Writing matrix ");
         fprintf(matrixFile, "%0.3lf ", sumArr[i][j]);
     }
     fprintf(matrixFile, "\n"); 
}

另外,请认真对待Craig Easley的评论。堆栈溢出可能发生,即使在本网站的前提下也是如此;)考虑在堆上动态分配矩阵。