像往常一样,我在这里阅读了相当多的帖子。我发现了一篇关于总线错误的特别有用的文章,请参见here。我的问题是我不能理解为什么我的特定代码会给我一个错误。
我的代码是试图自学C语言,这是我在学习Java时制作的一个游戏的修改。我在游戏中的目标是获得一个巨大的5049x1文本文件。随机选择一个单词,把它弄乱,然后试着猜出来。我知道该怎么做。无论如何,文本文件的每一行都包含一个单词,如下所示:
   5049
   must
   lean 
   better 
   program 
   now
   ...所以,我用C语言创建了一个字符串数组,试图读取这个字符串数组并将其放入C中。我没有做其他任何事情。一旦我将文件转换成C语言,剩下的事情就很容易了。更奇怪的是,它遵守了。当我使用./blah命令运行它时,我的问题就出现了。
我得到的错误很简单。上面写着:
zsh: bus error ./blah我的代码如下。我怀疑这可能与内存或缓冲区溢出有关,但这是完全不科学的,是一种直觉。我的问题很简单,为什么这段C代码会给我这个总线错误消息?
#include<stdio.h>
#include<stdlib.h>
//Preprocessed Functions 
void jumblegame();
void readFile(char* [], int);
int main(int argc, char* argv[])
{
    jumblegame();
}
void jumblegame()
{
    //Load File 
        int x = 5049; //Rows
        int y = 256; //Colums
        char* words[x]; 
        readFile(words,x);
    //Define score variables 
        int totalScore = 0;
        int currentScore = 0; 
   //Repeatedly pick a random work, randomly jumble it, and let the user guess what it is
}
void readFile(char* array[5049], int x) 
{
    char line[256]; //This is to to grab each string in the file and put it in a line. 
    FILE *file;
    file = fopen("words.txt","r");
    //Check to make sure file can open 
    if(file == NULL)
    {
        printf("Error: File does not open.");
        exit(1);
    }
    //Otherwise, read file into array  
    else
    {
        while(!feof(file))//The file will loop until end of file
        {
           if((fgets(line,256,file))!= NULL)//If the line isn't empty
           {
               array[x] = fgets(line,256,file);//store string in line x of array 
               x++; //Increment to the next line 
           }    
        }
    }
}发布于 2012-07-31 02:35:49
这一行有几个问题:
array[x] = fgets(line,256,file);//store string in line x of array if语句的条件下读取了这行:你想要操作的当前行在缓冲区中已经是了,现在你使用fgets来获取下一行。=复制字符串的时候都会递增。这只会复制引用,不会复制字符串的新副本。因此,数组的每个元素都将指向同一个buffer:line,当您的函数退出时,它将超出作用域并变得无效。要用字符串填充array,需要为数组复制每个字符串:使用malloc为每个新字符串分配空间,然后使用strncpy将每个line复制到新字符串中。或者,如果您可以使用strdup,它将为您分配空间。但我怀疑这是导致总线错误的原因:在循环中,将数组大小作为x传递,并将其赋值给array[x]。这样做的问题是,array[x]不属于该数组,该数组只有从0到(x - 1)的可用索引。
发布于 2012-07-31 02:37:15
您正在传递x的值5049。第一次
array[x] = ... 执行时,它访问的数组位置并不存在。
看起来你正在学习C语言。太棒了!您需要及早掌握的一项技能是基本的调试器使用。在这种情况下,如果使用
gcc -g myprogram.c -o myprogram然后用以下命令运行
gdb ./myprogram(我假设是Linux),您将获得一个堆栈转储,其中显示总线错误发生的行。这应该足以帮助你自己找出错误,从长远来看,这比问别人要好得多。
调试器还有许多其他有用的方式,但这是最重要的。它给了你一个了解你正在运行的程序的窗口。
发布于 2012-07-31 02:38:31
您将行存储在readFile函数内部定义的行缓冲区中,并将指向它的指针存储在数组中。这样做有两个问题:每次读取新字符串并且缓冲区在堆栈中时,都会覆盖该值;一旦函数返回,该值就会无效。
https://stackoverflow.com/questions/11727383
复制相似问题