我遇到一个问题,realloc
的调用似乎修改了另一个字符串keyfile
的内容。
它应该运行一个以空值终止的char*
(密钥文件),其中包含500个以上的字符。但问题是我在reallocation
循环中执行的while
似乎修改了密钥文件的内容。
我尝试使用realloc
删除动态重新分配,而是初始化for
- 循环中的指针,其大小为200*sizeof(int)
。问题仍然存在,{(1)}字符串在(重新)分配内存期间被修改,我不明白为什么。我已通过在keyfile
和malloc
语句之前和之后打印keyfile-string来确认这一点。
注意:密钥文件只包含字符realloc
,没有数字,空格,换行符或大写。只有26个小写字母的文字。
a-z
答案 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*));