我遇到其中realloc
調用似乎修改另一個字符串,keyfile
的內容的問題。的realloc()似乎影響已分配的內存
它應該通過的空終止char*
(密鑰文件),它包含正上方500個字符來運行。但是,問題是我在while
-loop中執行的reallocation
似乎修改了密鑰文件的內容。
我試圖與realloc
除去動態再分配和代替大小爲200*sizeof(int)
代替初始化在for
-loop指針。問題仍然存在,keyfile
字符串在內存(重新)分配期間被修改,我不知道爲什麼。我已經通過在malloc
和realloc
語句之前和之後打印keyfile-string來證實了這一點。
注:密鑰文件只包含字符a-z
,沒有數字,空格,換行或大寫。只有26個文字,小寫字母。
int **getCharMap(const char *keyfile) {
char *alphabet = "abcdefghijklmnopqrstuvwxyz";
int **charmap = malloc(26*sizeof(int));
for (int i = 0; i < 26; i++) {
charmap[(int) alphabet[i]] = malloc(sizeof(int));
charmap[(int) alphabet[i]][0] = 0; // place a counter at index 0
}
int letter;
int count = 0;
unsigned char c = keyfile[count];
while (c != '\0') {
int arr_count = charmap[c][0];
arr_count++;
charmap[c] = realloc(charmap[c], (arr_count+1)*sizeof(int));
charmap[c][0] = arr_count;
charmap[c][arr_count] = count;
c = keyfile[++count];
}
// Just inspecting the results for debugging
printf("\nCHARMAP\n");
for (int i = 0; i < 26; i++) {
letter = (int) alphabet[i];
printf("%c: ", (char) letter);
int count = charmap[letter][0];
printf("%d", charmap[letter][0]);
if (count > 0) {
for (int j = 1; j < count+1; j++) {
printf(",%d", charmap[letter][j]);
}
}
printf("\n");
}
exit(0);
return charmap;
}
的valgrind的valgrind的valgrind – bmargulies 2014-10-30 15:59:45
應該是'INT **字符表= malloc的(26 *的sizeof(INT *))'中如果您運行的是64位系統(或者極少數情況下是帶有16位寄存器的32位系統)。 – 2014-10-30 16:01:00