带数组的分段故障(堆芯转储)C程序 #包括 #包括 #定义大小1000 内部主(空) { 已发送字符[]=“\0”; 字符alpha[]=“abcdefghijklmnopqrstuvxyzabcdefghijklmnopqrstuvxyz”; 无符号整数计数; 无符号整数k; 无符号整数j; printf(“请输入要分析的句子\n”); FGET(已发送、大小、标准输入); printf(“\n字母\t | | \t计数\n”); printf(“==========================================================\n”); 对于(j=0;alpha[j]!='\0';j++) { 计数=0; 对于(k=0;已发送[k]!='\0';k++) { 如果(α[j]==发送[k]) { 计数++; } } printf(“\t%c\t | | \t%u\n”,α[j],计数); printf(“-------------------------------------\n”); } 返回0; }
每次我运行这个程序,我都会得到错误“分段错误(内核转储)”。然而,程序似乎运行正常。为什么会发生这种情况?我能做些什么来解决这个问题 在代码中带数组的分段故障(堆芯转储)C程序 #包括 #包括 #定义大小1000 内部主(空) { 已发送字符[]=“\0”; 字符alpha[]=“abcdefghijklmnopqrstuvxyzabcdefghijklmnopqrstuvxyz”; 无符号整数计数; 无符号整数k; 无符号整数j; printf(“请输入要分析的句子\n”); FGET(已发送、大小、标准输入); printf(“\n字母\t | | \t计数\n”); printf(“==========================================================\n”); 对于(j=0;alpha[j]!='\0';j++) { 计数=0; 对于(k=0;已发送[k]!='\0';k++) { 如果(α[j]==发送[k]) { 计数++; } } printf(“\t%c\t | | \t%u\n”,α[j],计数); printf(“-------------------------------------\n”); } 返回0; },c,arrays,string,fgets,C,Arrays,String,Fgets,每次我运行这个程序,我都会得到错误“分段错误(内核转储)”。然而,程序似乎运行正常。为什么会发生这种情况?我能做些什么来解决这个问题 在代码中 #include <stdio.h> #include <string.h> #define SIZE 1000 int main(void) { char sent[] = "\0"; char alpha[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstu
#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;
}
正在分配的数组大小仅等于提供的初始值设定项“\0”
(和null终止符)的大小。因此,在以后的某一点上,通过
char sent[] = "\0";
您正在访问超出限制的内存。这引起了人们的注意
引用C11
标准,第§6.7.9章
如果初始化了未知大小的数组,则其大小由索引的最大值确定
具有显式初始值设定项的元素。[……]
您需要的是在定义时提供数组大小,如
fgets(sent, SIZE, stdin);
所需的操作是生成segfault?
但是程序似乎运行正常。
等等……什么?
char sent[SIZE] = "\0";