【问题标题】:Why am I always getting Segmentation faults when displaying my array in C?为什么在 C 中显示我的数组时总是出现分段错误?
【发布时间】:2014-10-21 21:05:38
【问题描述】:

我尝试了很多代码来尝试在直方图中显示我的数据。我已经被这个问题困扰了两天了,数据在互联网上爬行等以找到答案,但他们通常谈论指针等。虽然这是更基本的。我尝试了一个显示相同错误的实际直方图,但为了简单起见,我选择发布这个。

这是来自 The C Programming language 的程序描述: “编写一个程序来打印其输入中单词长度的直方图。” 我是水平做的,然后我会垂直做。虽然,在这个例子中,我只是想显示数字,很明显。

#include <stdio.h>
#define MAXIMUM 99


main()
{
int i, c, j, lenOfWord[MAXIMUM], charCount;

for (i = 0; i < MAXIMUM; i++)
    lenOfWord[i] = 0;


printf("Starting program, please type then ctrl+d\n");



while((c = getchar()) != EOF) {
    if (c == ' ') {
        //new word
        ++lenOfWord[charCount];
        charCount = 0;
    }
    else
        //inword
        ++charCount;
}

printf("\n Displaying now... \n");


for (j = 0; j <= MAXIMUM; j++)
    printf("%d: %d", j, lenOfWord[j]); 


}

输出:

 JohnJackson@linux-72db:~/Desktop> gcc c.c -o c
 JohnJackson@linux-72db:~/Desktop> ./c
 Starting program, please type then ctrl+d
 Hello my name is john jacksonSegmentation fault

*最后的分段错误是我执行 EOF (ctrl+D) 时得到的结果

附加信息:openSUSE linux 终端中的 GCC 编译器

非常感谢,我正在努力学习 C,但我遇到了很多这样的障碍,我感到很沮丧。

【问题讨论】:

  • 编译时包含所有警告和调试信息 (gcc -Wall -Wextra -g)。使用调试器 (gdb)
  • j &gt;= MAXIMUM?这将在第一次迭代时终止你的循环。 for() 的第二个子句是循环终止条件。只要条件评估为“真”,循环就会继续执行。您基本上已将循环设置为失败,因为0 &gt;= 99 立即为假。
  • charCount 从未初始化,您正在尝试访问 lenOfWord[charCount]
  • 对不起大家,我修复了 for 错误,但我得到了同样的分段错误
  • @user275564 您修复了哪些错误 - 为什么不使用当前不起作用的内容更新问题?

标签: c arrays fault


【解决方案1】:

实际问题是

++lenOfWord[charCount];
        charCount = 0;

在使用之前,您还没有将charCount 初始化为0。循环前先初始化为0

charCount = 0;

while((c = getchar()) != EOF) {

在循环中将charCount 分配给0 是没有用的。删除它。

你必须再检查一件事。由于数组大小为MAXIMUM。所以你必须检查charCount 不超过MAXIMUM。否则,它会再次给segmentation fault

另一个问题是for循环条件。而不是

for (i = 0; i < MAXIMUM; i++)

改成

for (i = 0; i < MAXIMUM; i++)

代替

for (j = 0; j >= MAXIMUM; j++)

for (j = 0; j < MAXIMUM; j++)

否则你不会得到任何输出。

【讨论】:

  • 我认为你是对的,非常感谢。虽然,我相信在空格后将 charCount 设置回 0 对程序来说是必不可少的。空格后的 char Count 为 0。
  • 你的例子中前两个 for 语句有什么区别?
【解决方案2】:

您的 charCount 变量未初始化

【讨论】:

  • 谢谢先生/妈妈,问题解决了。我认为这是我最后一个版本的程序的问题。经验教训!
猜你喜欢
  • 2020-02-25
  • 2020-02-27
  • 1970-01-01
  • 2014-11-29
  • 2019-03-15
  • 1970-01-01
  • 2019-01-07
  • 2020-08-23
  • 2018-01-07
相关资源
最近更新 更多