[英]realloc() seems to affect already allocated memory
我遇到一个问题,其中调用realloc
似乎会修改另一个字符串keyfile
的内容。
它应该通过以null终止的char*
(密钥文件)运行,该字符包含刚好超过500个字符。 但是,问题是我在while
-loop中执行的reallocation
似乎修改了密钥文件的内容。
我尝试使用realloc
删除动态重新分配,而是使用200*sizeof(int)
的大小在for
-loop中初始化指针。 问题仍然存在, keyfile
字符串在(重新)分配内存时被修改,我不知道为什么。 我已经通过在malloc
和realloc
语句前后打印密钥文件字符串来确认这一点。
注意:密钥文件仅包含字符az
,没有数字,空格,换行符或大写字母。 仅包含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;
}
charmap[(int) alphabet[i]] = malloc(sizeof(int));
charmap[(int) alphabet[i]][0] = 0; // place a counter at index 0
您的写作超出了charmap
数组的末尾。 因此,您正在调用未定义的行为,并且看到奇怪的效果也就不足为奇了。
您正在使用字符代码作为数组的索引,但是它们不是从0开始! 它们以a
的ASCII码开头。
您应该使用alphabet[i] - 'a'
作为数组索引。
以下代码是麻烦的根源:
int **charmap = malloc(26*sizeof(int));
for (int i = 0; i < 26; i++)
charmap[...] = ...;
如果sizeof(int) < sizeof(int*)
,则它将执行非法的内存访问操作。
例如,在64位平台上,大小写通常为sizeof(int) == 4 < 8 == sizeof(int*)
。
在这种情况下,通过写入charmap[13...25]
,您将访问未分配的内存。
更改此:
int **charmap = malloc(26*sizeof(int));
对此:
int **charmap = malloc(26*sizeof(int*));
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.