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

realloc()似乎会影响已分配的内存,c,malloc,realloc,C,Malloc,Realloc,我遇到一个问题,调用realloc似乎会修改另一个字符串keyfile的内容 它应该通过一个以null结尾的char*(keyfile)运行,该文件包含500个字符。然而,问题是我在循环中执行的重新分配,而循环似乎修改了密钥文件的内容 我尝试用realloc删除动态重新分配,并用200*sizeof(int)的大小初始化for-循环中的指针。问题仍然存在,在(重新)分配内存期间,keyfile字符串被修改,我不知道为什么。我通过在malloc和realloc语句前后打印keyfile字符串来确认

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

它应该通过一个以null结尾的
char*
(keyfile)运行,该文件包含500个字符。然而,问题是我在
循环中执行的
重新分配
,而
循环似乎修改了密钥文件的内容

我尝试用
realloc
删除动态重新分配,并用
200*sizeof(int)
的大小初始化
for
-循环中的指针。问题仍然存在,在(重新)分配内存期间,
keyfile
字符串被修改,我不知道为什么。我通过在
malloc
realloc
语句前后打印keyfile字符串来确认这一点

注意:密钥文件仅包含字符
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;
}
int**getCharMap(const char*keyfile){
char*alphabet=“abcdefghijklmnopqrstuvxyz”;
int**charmap=malloc(26*sizeof(int));
对于(int i=0;i<26;i++){
charmap[(int)字母表[i]]=malloc(sizeof(int));
charmap[(int)字母表[i]][0]=0;//在索引0处放置一个计数器
}
整数字母;
整数计数=0;
无符号字符c=keyfile[count];
而(c!='\0'){
int arr_count=charmap[c][0];
arr_计数++;
charmap[c]=realloc(charmap[c],(arr_count+1)*sizeof(int));
charmap[c][0]=arr_计数;
charmap[c][arr_count]=计数;
c=密钥文件[++计数];
}
//只是检查调试的结果
printf(“\nCHARMAP\n”);
对于(int i=0;i<26;i++){
字母=(int)字母表[i];
printf(“%c:”,(字符)字母);
int count=charmap[letter][0];
printf(“%d”,字符映射[字母][0]);
如果(计数>0){
对于(int j=1;j
您正在写入超出
charmap
数组末尾的内容。因此,您正在调用未定义的行为,并且看到奇怪的效果也就不足为奇了

您正在使用字符代码作为数组的索引,但它们不是从0开始的!它们从
a
的ASCII码开始


您应该使用字母表[i]-“a”
作为数组索引。

以下代码是问题的根源:

int **charmap = malloc(26*sizeof(int));
for (int i = 0; i < 26; i++)
    charmap[...] = ...;
为此:

int **charmap = malloc(26*sizeof(int*));

valgrind valgrind Valgrinds应该是
int**charmap=malloc(26*sizeof(int*))
,以防在64位系统上运行(或者在罕见的32位系统中使用16位寄存器)。您还应该在注释中包含@barakmanos指出的错误。这是我需要的,也是一个非常聪明的解决方案。谢谢!。。。或者
int**charmap=malloc(26*sizeof*charmap)@chux:再次感谢您的启发。我同意在这种情况下使用符号名,因此初始化独立于变量类型。
int **charmap = malloc(26*sizeof(int));
int **charmap = malloc(26*sizeof(int*));