文件解析代码中的分段错误

时间:2011-12-13 07:07:39

标签: c segmentation-fault

当我尝试运行添加矩阵的程序时,我遇到了分段错误。我试图单独运行程序~1000次(同时计时每次运行并将结果写入文件)。

问题是,经过多次运行后我得到了分段错误 - 我得到多远取决于矩阵的大小。例如,如果我运行10x10矩阵(每个实例都有随机生成的数字),那么在1013次运行后我就会出现分段错误。对于100x100矩阵,我得到260次运行的段错误。

快速了解该计划的运作方式如下:

  1. 根据输入的输入(10x10,100x100)随机生成数字并将其写入文件
  2. 从文件中读取数字并发送至CUDA *
  3. CUDA计算结果并将其写入结果文件(并计算计算所需的时间并将其写入另一个文件)
  4. *此步骤似乎根据GDB调试器导致分段错误。下面是调试器的错误输出和导致错误的函数。

    >Program terminated with signal 11, Segmentation fault.
    #0  0x0000000000402f4c in readFromFile(int, char, int&, int&, float*) ()
    

    这是实际功能:

      void readFromFile(int fd, char byte, int &matrixWidth, int &matrixHeight,float *matrix)
        {
        int tokenIndex = 0;
        char *token = (char*) malloc(500); 
        int matrixIndex = 0;
        while(read(fd,&byte,1)){
            if(isdigit(byte)||byte=='.'){
                token[tokenIndex]=byte;
                tokenIndex++;
            }
            else if(byte==' ' && matrixHeight==0){
                matrixWidth++;
                token[tokenIndex]='\0';
                matrix[matrixIndex]=atof(token);
                //printf("Stored: %d\n",matrixOne[matrixIndex]);
                tokenIndex=0;
                matrixIndex++;
            }
            else if(byte=='\n'){
                matrixHeight++;
                if(tokenIndex!=0){
                    token[tokenIndex]='\0';
                    matrix[matrixIndex]=atof(token);
                    //printf("Stored: %d\n",matrixOne[matrixIndex]);
                    tokenIndex=0;
                    matrixIndex++;
                }
            }
            else if(byte==' ' && matrixHeight!=0){
                token[tokenIndex]='\0';
                matrix[matrixIndex]=atof(token);
                tokenIndex=0;
                matrixIndex++;
            }
            //printf("Token: %s, number matrix: %f\n" , token, matrix[matrixIndex-1]);
        }
    }
    

    此代码重复运行,直到分段错误(每次读取的文件具有不同的数字)。如果您需要更多代码,请告诉我们。非常感谢任何帮助。

2 个答案:

答案 0 :(得分:0)

有许多问题可能导致您发布的代码中出现分段错误。我列举一些:

  • 正如Jens所指出的,你有多确定任何令牌的大小实际上是< 500个字符
  • 你有多确定没有像1.32.4那样的连续数字? ATOF可能会崩溃,所以使用strtod而不是
  • 使用调试程序运行程序,因为 macs 指出它将为您提供崩溃的行,您可以看到变量的值,这样可以让您更好地了解
  • 在读取输入时使用安全检查,因为连续数字可能是最少的问题。多个'\ n'字符可能会弄乱它。
  • 由于所有内容都是文本,我建议您使用fscanf阅读,而不是构建自己的版本。
  • 阅读Row major vs. Column Major formats,具体取决于您可能不需要跟踪维度的数据

答案 1 :(得分:0)

如何为矩阵分配内存?同样重要的是,你释放它吗?无论如何,提示:使用-g选项编译程序以生成调试信息,并学习如何使用调试器。然后你会发现问题,而我们可以猜测。