【发布时间】:2014-10-30 15:55:19
【问题描述】:
我遇到了一个问题,realloc 的调用似乎修改了另一个字符串 keyfile 的内容。
它应该通过一个以 null 结尾的 char*(密钥文件)运行,其中包含刚刚超过 500 个字符。然而,问题是我在while-loop 中执行的reallocation 似乎修改了密钥文件的内容。
我尝试使用realloc 删除动态重新分配,而是使用200*sizeof(int) 的大小初始化for-循环中的指针。问题仍然存在,keyfile 字符串在(重新)分配内存期间被修改,我不知道为什么。我已经通过在 malloc 和 realloc 语句之前和之后打印密钥文件字符串来确认这一点。
注意:密钥文件只包含字符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
-
应该是
int **charmap = malloc(26*sizeof(int*)),以防您在 64 位系统上运行(或者在极少数情况下是具有 16 位寄存器的 32 位系统)。