realloc()似乎影响已经分配的内存

时间:2014-10-30 15:55:19

标签: c malloc realloc

我遇到一个问题,realloc的调用似乎修改了另一个字符串keyfile的内容。

它应该运行一个以空值终止的char*(密钥文件),其中包含500个以上的字符。但问题是我在reallocation循环中执行的while似乎修改了密钥文件的内容。

我尝试使用realloc删除动态重新分配,而是初始化for - 循环中的指针,其大小为200*sizeof(int)。问题仍然存在,{(1)}字符串在(重新)分配内存期间被修改,我不明白为什么。我已通过在keyfilemalloc语句之前和之后打印keyfile-string来确认这一点。

注意:密钥文件只包含字符realloc,没有数字,空格,换行符或大写。只有26个小写字母的文字。

a-z

2 个答案:

答案 0 :(得分:6)

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'作为数组索引。

答案 1 :(得分:1)

以下代码是麻烦的来源:

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*));
相关问题