Прежде всего, я считаю, что манифест константы 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