带数组的分段错误(核心转储)C程序

时间:2016-03-09 20:15:30

标签: c arrays string fgets

#include <stdio.h>
#include <string.h>
#define SIZE 1000

int main(void)
{
char sent[] = "\0";        
char alpha[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz ";
unsigned int count;
unsigned int k;
unsigned int j;                                                            

printf("Please enter a sentence to analyze\n");
fgets(sent, SIZE, stdin);  


printf("\n     Letter\t ||\tAmount\n");
printf(" ================================\n");

    for(j = 0; alpha[j] != '\0'; j++)
    {
        count = 0;

        for (k = 0; sent[k]!= '\0'; k++)
        {

            if ( alpha[j] == sent[k])
            {                          
                count++;                                   
            }

        }

        printf("\t%c\t ||\t %u\n", alpha[j], count);
        printf(" --------------------------------\n");  
    }  


    return 0;

}

每次运行此程序时,我都会收到错误&#34; Segmentation Fault(Core Dumped)&#34;。但是该程序似乎运行正常。为什么会发生这种情况,我该怎么做才能解决这个问题?

1 个答案:

答案 0 :(得分:1)

在您的代码中,

 char sent[] = "\0"; 

分配的数组大小仅等于提供的初始化程序"\0"(和null终止符)的大小。所以,稍后,通过

fgets(sent, SIZE, stdin);

你正在访问超出范围的内存。这会调用undefined behavior

引用C11标准,章节§6.7.9

  

如果初始化未知大小的数组,则其大小由索引最大的数组决定   具有显式初始化程序的元素。 [...]

您需要的是在定义时提供数组大小,如

 char sent[SIZE] = "\0";