为什么这个简单的C代码会给出总线错误? #包括 #包括 #包括 #包括 #包括 //这里我声明了全局变量。 国际答复者[26]; 字符*字母1; 静态void makeRepLetters() { printf(“输入makeRep”); int i=0; 对于(;i
而言,此处最有可能发生碰撞:为什么这个简单的C代码会给出总线错误? #包括 #包括 #包括 #包括 #包括 //这里我声明了全局变量。 国际答复者[26]; 字符*字母1; 静态void makeRepLetters() { printf(“输入makeRep”); int i=0; 对于(;i,c,C,而言,此处最有可能发生碰撞: #include <stdio.h> #include <stdlib.h> #include <assert.h> #include <string.h> #include <math.h> // Here i declared global variables. int repLetters[26]; char* letters1; static void makeRepLetters() {
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <string.h>
#include <math.h>
// Here i declared global variables.
int repLetters[26];
char* letters1;
static void makeRepLetters()
{
printf("enter makeRep");
int i =0;
for(;i<26;i++)
repLetters[i] =0;
for(i=0;i<26;i++) {
repLetters[((letters1[i]) - 97)] +=1;
}
}
int main(int argc, char *argv[])
{
int i=0,num =10;
if(argc != 2) {
printf("Usage: %s <letters>\n", argv[0]);
return 1;
}
//letters1 = (char*)malloc(sizeof(char)* strlen( argv[1]));
//strcpy(letters1,argv[1]);
letters1 = argv[1];
printf("\n letters1 = %s",letters1);
scanf("%d",&num);
printf("\ncheck test\n");
makeRepLetters();
for(i=0;i<26;i++)
printf("\n %c occured %d tyms",i+97,repLetters[i]);
return 0;
}
如果字母1
不包含26个字符怎么办?您现在正在访问一个超出边界的数组
唯一确定的方法是在调试器中运行程序(发生崩溃时,您总是应该这样做).不要假设您曾经为
字母1
@chris分配过内存,我是通过分配内存来完成的,然后在同一个位置也出现了相同的错误。您可以看到我对内存分配代码进行了注释,并直接将字母1指向argv[1];请注意,由于您在makeRepLetters()中打印的消息
不会以换行符结尾,并且您也不会fflush(stdout)
,在程序崩溃之前输出不会出现。如果您想查看诊断输出,请确保它以换行符结尾(即使这样,如果您将输出发送到文件,您也希望在打印后执行fflush(stdout)
或fflush(0)
).或者,如果字母1[i]的值小于97怎么办?那么您正在对回复者使用负索引。或者,如果“abc…xyz”的值不是97…122怎么办?
repLetters[((letters1[i]) - 97)] +=1;