在while循环中将带有scanf的整数放入内存分配中并重新分配

时间:2019-05-16 22:14:23

标签: c malloc scanf realloc

我声明一个int指针并为其分配内存。然后,我向其中输入整数,直到用户输入 Ctrl + d 。除非我尝试输入7个或更多,否则该循环工作正常,这时会给我一个错误,看起来像“ realloc():下一个无效大小”,并给我回溯/内存映射。它与我的realloc行有关,但是我不确定。有人可以启发我吗?

int  n= 0, *x, i;
double mean = 0.0, median = 0.0, stdDev = 0.0;

x =  malloc(sizeof(int));
for(i = 0; scanf("%d", &x[i]) != -1; i++) {
        n++;
        x = realloc(x, n+1 * sizeof(int));
        mean = findMean(x, n);
        median = findMedian(x, n);
        stdDev = findStandardDeviation(x, n, mean);
}

2 个答案:

答案 0 :(得分:2)

问题是操作顺序:n + 1 * sizeof(int)的意思是“乘以sizeof(int)的1倍,然后加n”。您可以使用括号强制执行以下命令:(n + 1) * sizeof(int)

内存分配可能很昂贵!要求分配一个合理的内存块,然后每隔一段时间将其增加2倍。在进行内存分配系统调用时,操作系统可能会为您提供比您要求的更大的块,以便后续的realloc调用的成本较低,并且使用了程序可用的内存。

请检查您的mallocrealloc呼叫是否成功,这是很好的。如果分配请求失败,这些函数将返回NULL。

此外,完成操作后,请不要忘记free已分配的内存,以避免内存泄漏。

编写自己的类似于“ vector / ArrayList / list”的界面可能会很有趣,该界面会按大小扩展和收缩,并可能具有slice(start_index, end_index)remove(index)之类的操作。

这是一个完整的例子:

#include <stdio.h>
#include <stdlib.h>

int main() {
    int nums_len = 0;
    int nums_capacity = 5;
    int *nums = malloc(nums_capacity * sizeof(int));

    while (scanf("%d", &nums[nums_len]) != -1) {
        if (++nums_len >= nums_capacity) {
            printf("increasing capacity from %d to %d\n", 
                   nums_capacity, nums_capacity * 2);

            nums_capacity *= 2;
            nums = realloc(nums, nums_capacity * sizeof(int));

            if (!nums) {
                fprintf(stderr, "%s: %d: realloc failed\n", 
                        __func__, __LINE__);
                exit(1);
            }
        }

        printf("got: %d\n", nums[nums_len-1]);
    }

    printf("Here are all of the %d numbers you gave me:\n", nums_len);

    for (int i = 0; i < nums_len; i++) {
        printf("%d ", nums[i]);
    }

    puts("");
    free(nums);
    return 0;
}

示例运行:

5
got: 5
6
got: 6
7
got: 7
8
got: 8
1
increasing capacity from 5 to 10
got: 1
3
got: 3

5
got: 5
6
got: 6
7
got: 7
1
increasing capacity from 10 to 20
got: 1
2
got: 2
3
got: 3
4
got: 4
5
got: 5
6
got: 6
67
got: 67
8
got: 8
1
got: 1
2
got: 2
3
increasing capacity from 20 to 40
got: 3
4
got: 4
1
got: 1
2
got: 2
Here are all of the 23 numbers you gave me:
5 6 7 8 1 3 5 6 7 1 2 3 4 5 6 67 8 1 2 3 4 1 2

答案 1 :(得分:1)

n+1 * sizeof(int)(n+1) * sizeof(int)

不同