之间有什么区别
int size;
int *arr;
scanf("%i", &size);
arr = malloc(size * sizeof(*arr));
和
int size;
scanf("%i", &size);
int arr[size];
当我想为2个大数字分配内存时,我会使用 以下代码:
unsigned long *big_nums;
big_nums = malloc(2 * sizeof(*big_nums));
我会使用big_nums [0]访问第一个大号bumber 一个有big_nums [1]。假设 unsigned long 大4字节, 然后代码将分配2 * 4 = 8个字节。让我们说我做 像这样的东西:
unsigned long *big_nums;
big_nums = malloc(7);
使用big_nums [0]对我来说很清楚,但big_nums [1]怎么样?将 它会导致某种分段错误错误或什么?
答案 0 :(得分:2)
有两个地方可以获取内存:堆栈和堆。堆栈是您分配短期事物的地方,堆用于分配长期事物。
malloc()
从堆中分配,int arr[size]
从堆栈中分配。
当您的功能退出时,arr[size]
将自动处理,但malloc()
则不会。这导致了所谓的“内存泄漏”。
big_nums = malloc(7);
如果访问big_nums [1],确实会出错。一般来说,标准说行为是“未定义的”,这意味着它可以工作,也可能不工作。
答案 1 :(得分:1)
对于Q#1:第二个版本将(尝试)在堆栈上分配可变长度数组。在C99以后,这是可能的;但是在传统的C中,可变长度数组不存在,您必须使用malloc自己滚动它们。
答案 2 :(得分:0)
对于Q#2:您将被允许犯这个错误。当你写入数组的第二个元素时,你将覆盖一个不属于你的字节。
我的猜测是,在大多数情况下,没有任何不好的事情会发生,因为malloc(7)
将秘密地等同于malloc(8)
。但是这有 NO GUARANTEE 。任何事情都可能发生,包括段错或更糟糕的事情。
顺便说一下,如果你有两个不同的问题,最好将它们写成两个单独的问题。你得到更多分数。