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

kry*_*tah 0 c malloc realloc

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

它应该运行一个以null结尾char*(密钥文件),其中包含500个以上的字符.然而,问题是reallocation我在while-loop中执行似乎修改了密钥文件的内容.

我尝试删除动态重新分配,reallocfor使用大小200*sizeof(int)而不是初始化-loop中的指针.问题仍然存在,keyfile字符串在(重新)分配内存期间被修改,我不知道为什么.我通过在mallocrealloc语句之前和之后打印keyfile-string来确认这一点.

注意:密钥文件仅包含字符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;
}
Run Code Online (Sandbox Code Playgroud)

Gra*_*and 6

charmap[(int) alphabet[i]]    = malloc(sizeof(int)); 
charmap[(int) alphabet[i]][0] = 0; // place a counter at index 0
Run Code Online (Sandbox Code Playgroud)

您正在编写超出charmap阵列末尾的内容.所以,你正在调用未定义的行为,你看到奇怪的效果就不足为奇了.

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

您应该使用alphabet[i] - 'a'您的数组索引.