首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么这段C代码会给我一个总线错误?

为什么这段C代码会给我一个总线错误?
EN

Stack Overflow用户
提问于 2012-07-31 02:29:02
回答 6查看 11.8K关注 0票数 3

像往常一样,我在这里阅读了相当多的帖子。我发现了一篇关于总线错误的特别有用的文章,请参见here。我的问题是我不能理解为什么我的特定代码会给我一个错误。

我的代码是试图自学C语言,这是我在学习Java时制作的一个游戏的修改。我在游戏中的目标是获得一个巨大的5049x1文本文件。随机选择一个单词,把它弄乱,然后试着猜出来。我知道该怎么做。无论如何,文本文件的每一行都包含一个单词,如下所示:

代码语言:javascript
运行
复制
   5049
   must
   lean 
   better 
   program 
   now
   ...

所以,我用C语言创建了一个字符串数组,试图读取这个字符串数组并将其放入C中。我没有做其他任何事情。一旦我将文件转换成C语言,剩下的事情就很容易了。更奇怪的是,它遵守了。当我使用./blah命令运行它时,我的问题就出现了。

我得到的错误很简单。上面写着:

代码语言:javascript
运行
复制
zsh: bus error ./blah

我的代码如下。我怀疑这可能与内存或缓冲区溢出有关,但这是完全不科学的,是一种直觉。我的问题很简单,为什么这段C代码会给我这个总线错误消息?

代码语言:javascript
运行
复制
#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 
           }    
        }
    }

}
EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2012-07-31 02:35:49

这一行有几个问题:

代码语言:javascript
运行
复制
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)的可用索引。

票数 5
EN

Stack Overflow用户

发布于 2012-07-31 02:37:15

您正在传递x的值5049。第一次

代码语言:javascript
运行
复制
array[x] = ... 

执行时,它访问的数组位置并不存在。

看起来你正在学习C语言。太棒了!您需要及早掌握的一项技能是基本的调试器使用。在这种情况下,如果使用

代码语言:javascript
运行
复制
gcc -g myprogram.c -o myprogram

然后用以下命令运行

代码语言:javascript
运行
复制
gdb ./myprogram

(我假设是Linux),您将获得一个堆栈转储,其中显示总线错误发生的行。这应该足以帮助你自己找出错误,从长远来看,这比问别人要好得多。

调试器还有许多其他有用的方式,但这是最重要的。它给了你一个了解你正在运行的程序的窗口。

票数 2
EN

Stack Overflow用户

发布于 2012-07-31 02:38:31

您将行存储在readFile函数内部定义的行缓冲区中,并将指向它的指针存储在数组中。这样做有两个问题:每次读取新字符串并且缓冲区在堆栈中时,都会覆盖该值;一旦函数返回,该值就会无效。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11727383

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档