繁体   English   中英

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

[英]realloc() seems to affect already allocated memory

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

它应该通过以null终止的char* (密钥文件)运行,该字符包含刚好超过500个字符。 但是,问题是我在while -loop中执行的reallocation似乎修改了密钥文件的内容。

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

注意:密钥文件仅包含字符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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM