首先,我认为清单常数NO_CHAR
必须在第一个语句之前定义。也就是说,不是
int *count=(int*)calloc(NO_CHAR,sizeof(int));
char str="test string";
#define NO_CHAR 256
//...
必须有
#define NO_CHAR 256
int *count=(int*)calloc(NO_CHAR,sizeof(int));
char str="test string";
//...
,因为这种不断在释放calloc调用中使用。
至于程序,那么它有未定义的行为。根据编译器选项,类型char
可以表现为类型signed char
或类型unsigned char
。
因此这将是正确地写
count[(unsigned char)*(str+i)]++;
代替
count[*(str+i)]++;
否则,可能会发生这样一种方式,下标操作的索引(平方brakets内表达)将是负。
所以如果重写此代码段正确
#define NO_CHAR 256
int *count = (int*)calloc(NO_CHAR, sizeof(int));
char str = "test string";
fillChar(str,count);
//...
void fillChar(char *str, int *count){
int i;
for (i = 0; *(str+i); i++)
count[(unsigned char)*(str+i)]++;
}
然后计算符号的出现次数字符串“测试字符串”。无符号字符的总数是256(请参阅#define NO_CHAR 256)。所以动态分配数组的每个元素都对应于某个字符。例如,字符'a'
具有内部ASCII码96
。因此索引为96
的数组元素将包含字符串中字符'a'的出现次数。此元件可以像
count[96]
来解决这等同于表达*(str+i)
提供str + i
指向源串中字符'a'
。
“我知道”后面有一些完整的误解...... –
你不应该传递一个指针来指定大小'void fillChar(char * str,int count){'。 –
但为什么,??,我没有得到任何问题 – sa8