c - 循环内的内存初始化 : Segmentation fault on free

标签 c memory-leaks free

<分区>

我为一个嵌入式系统编写了这段相当大的代码,其中一个函数用于在循环中计算并将值分配给 calloc 结构。我在代码中遇到了一个错误,我花了一些时间来隔离和修复。如果需要,我想先看看其他人是否可以指出错误,然后再分享我的经验。

声明 block :

int *arr;
int i, num;
printf("Enter number of elements: ");
scanf("%d", &num); //Assume num>=0
arr = calloc(num, sizeof(int));
if (arr == NULL)
    return;
i = num;

以下哪个/哪些代码块会在调用 free() 时抛出异常,为什么?

for (i; i > 0; i--) {
    arr[num - i] = i;
}
free(arr);

while (i--) {
    arr[num - i] = i;
}
free(arr);

最佳答案

你的第二个循环

while (i--) 
{
  arr[num - i] = i;
  printf("i = %d, num - i = %d, arr = %d\t", i, num - i, arr[num - i]);
}

由于 i 的后递减导致问题

您从 i == 10 开始,所以第一个赋值是 arr[10 - 9] = 9; 当 i 到达 1 时,这是你得到的最后一个循环 arr[10 - 0] = 0

并导致赋值写入数组范围 0..9 之外

如果你像这样写 while 循环它应该可以工作

do 
{
  arr[num - i] = i;
  printf("i = %d, num - i = %d, arr = %d\t", i, num - i, arr[num - i]);
}
while (--i);

关于c - 循环内的内存初始化 : Segmentation fault on free,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13523810/

相关文章:

来自 Google I/O 的 Android 内存泄漏示例

testing - 无法激活最新的Katalon studio测试工具

c - 如何释放另一个结构体内部的结构体

c - 如何在 linux 内核 3.5 编程中用 null/0s/1s 替换文件的内容

C- 浮点精度

android - 使用 Bazel 为 Android 编译 OpenSSL

iphone - 了解内存泄漏检查工具 - iPhone

c - 我可以在文件系统驱动程序中的 ZwCreateFile/InitializeObjectAttributes 中设置/检查用户定义的标志吗?

ios - XCode Instruments:泄漏NSMallocBlock没有扩展细节的堆栈跟踪

c - 基本 Malloc/免费