首先,我認爲清單常數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