【问题标题】:Bus error: 10. No errors when compiling总线错误:10。编译时没有错误
【发布时间】:2016-03-14 02:22:58
【问题描述】:

所以基本上当我使用 GCC 编译器编译我的代码时,我没有收到任何错误或警告,但是当我输入第一条数据时,它会显示:

Bus error: 10.

我不确定我做错了什么。我认为问题来自void anagramGrouping(最后一个函数)。我还包含了其余代码以帮助遵循逻辑。

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

#define Row 2
#define col 20

int wordCount = 0;
int groupCount = 0;
char wordList[Row][col];
char group[Row][col];

// this is where prototypes go
void sortword(char word[col]);                 
void anagramGrouping(char word[col], char copy[col]);   
void resetGroup();                                   

int main() {
    int i; // used in for loop to 'get' the strings 
    char word[col];

    resetGroup();

    for (i = 0; i < Row; i++) {
        scanf("%s", word);
        sortword(word);
        wordCount++;
    }
}

void resetGroup() {
    int i;

    for (i = 0; i < Row; i++)
        strcpy(group[i], " ");
}

void sortword(char word[col]) {
    int i = 0; 
    char temp;
    char copy[col]; // used to store a copy of the original word

    strcpy(copy, word);

    while (word[i] != '\0') {
        int j = i + 1;

        while (word[j] != '\0') {
            if (word[j] < word[i]) {
                temp = word[i];
                word[i] = word[j];
                word[j] = temp;
            }
            j++;
        }
        i++;
    }
    anagramGrouping(word,copy);
}

void anagramGrouping(char word[col], char copy[col]) {
    int n;

    if (wordCount == 0) {
        strcpy(group[0], copy);
    }

    for (n = 0; n <= groupCount; n++) {
        if (strcmp(group[n], word) == 0) {
            strcpy(group[n], copy);
        } else {
            groupCount++;
            strcpy(group[groupCount], copy);
        }
    }
}

【问题讨论】:

  • 在 valgrind 或 gdb 中运行你的程序,看看哪一行触发了崩溃。
  • 很抱歉不能提供更多帮助,但请尝试检查您的指针/取消引用。
  • 您的代码呈现得很糟糕。修复缩进,去掉无用的// end of functioncmets。
  • 我清理了代码的缩进。另外,我以前从未听说过 valgrind 或 gdb。
  • 您的anagramGrouping 函数似乎是问题所在。每次发现不匹配时,您都会增加groupCount。在本例中,不允许超过 2(甚至达到),但几乎可以肯定会超过 2,这会导致内存错误。

标签: c macos unix bus-error


【解决方案1】:

对于初学者来说,改变所有

sortword (char word[col])

sortword (char *word)

和所有的

anagramGrouping (char word[col], char copy[col]) 

anagramGrouping (char *word, char *copy)

当你传递char copy[col] 时,你传递的是一个character array,它在作为函数参数传递时被转换为一个指针。 (你会听到短语“decays to a pointer”,这并不完全正确,但通常用于表示同一件事)。这不是导致bus error 的问题,但会使您的代码更具可读性。

接下来,您的bus error 通常是由于误用了指针值,当取值时,该值超出了程序允许的内存范围,通常在 system 区域导致bus error。查看您的代码,很难说出许多问题中的哪一个可能是确切原因。然而,一个可能的罪魁祸首是:

for(n=0; n <= groupCount; n++)
{
    if ( strcmp(group[n],word) ==0 )
    {
        strcpy(group[n],copy);
    }
    else
    {
        groupCount++;
        strcpy(group[groupCount],copy);
    }
}

在通过调试器运行时,您会很快发现groupCount 的增长远远超过1,导致strcpy(group[groupCount],copy) 写入超出char group[Row][col]; 的末尾。其中允许的行值被限制为 0-1#define Row 2

要将副本限制在允许的范围内,请将循环条件更改为:

for (n = 0; n < Row; n++) {

您的代码的进一步清理可能如下所示:

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

#define Row 2
#define col 20

int wordCount = 0;
int groupCount = 0;
char wordList[Row][col];
char group[Row][col];

void sortword (char *word);                 
void anagramGrouping (char *word, char *copy);   
void resetGroup();                                   

int main (void) {

    int i;
    char word[col] = "";

    resetGroup();

    for (i = 0; i < Row; i++)
    {
        scanf ("%s", word);
        sortword (word);
        wordCount++;
    }

    return 0; /* main is a function of type 'int' and returns a value */
}

void resetGroup()
{
    int i;

    for (i = 0; i < Row; i++)
        *group[i] = 0;
}

void sortword (char *word)
{
    int i = 0; 
    char temp;
    char copy[col] = "";

    strcpy (copy, word);

    while (word[i]) {
        int j = i + 1;
        while (word[j]) {
            if(word[j] < word[i]) {
                temp = word[i];
                word[i] = word[j];
                word[j] = temp;
            }
            j++;
        }
        i++;
    }
    anagramGrouping (word,copy);
}

void anagramGrouping (char *word, char *copy)
{
    int n;

    if (!wordCount)
        strcpy (group[0],copy);

    for (n = 0; n < Row; n++) {
        if (strcmp (group[n], word) == 0)
            strcpy(group[n],copy);
        else {
            groupCount++;
            strcpy (group [groupCount],copy);
        }
    }
}

如果您有任何问题,请告诉我。

【讨论】:

  • 关于不传递数组的全部废话与问题无关,也是不好的建议。 char word[col]char* word 更具可读性和类型安全性。如果有的话,应该将函数更改为sortword (size_t col, char word[col]),使其独立于宏并且更加安全。
  • 另外关于您关于衰减是不正确的术语的评论......转换更不正确,因为标准使用的术语转换是在运行时发生的。阵列衰减不会。 C 标准实际上使用“调整”一词来描述这一点(6.7.6.3):“将参数声明为“类型数组”应调整为“类型限定指针”,其中类型限定符(如果有的话)是在数组类型派生的 [ 和 ] 中指定的那些。”
  • 好点。 'adjust' 是 -- 完成后,您将得到一个转换为指针的数组 :)
  • @Lundin 对于是否在参数列表中显示数组或指针,我不同意您的 cmets。因为数组是'adjusted',所以函数不接收数组,它接收一个pointer-to-the-array,这使得指针清楚地指示了函数可用的内容。跨度>
  • 数组样式的优点是它可以提高类型安全性,以便好的编译器或外部静态分析器可以标记与类型相关的警告。除此之外,主要是风格问题,但如果是这样,C99委员会不同意你选择的风格。否则,他们就不会发明所有可以放入数组样式函数参数中的稍微有用的东西。如果你喜欢的风格是正确的,那么为什么 C99 发明了数组限定符 func (int a[const 10])、“最少 n 项”func (int a[static 10]) 和 VLA 原型 func (int, int [*])
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-07-14
  • 2011-07-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多