【问题标题】:Getting an Exception thrown says "project.exe has triggerd a breakpoint" while trying to free an allocated memory of an array in C在尝试释放 C 中数组的分配内存时,抛出异常说“project.exe 已触发断点”
【发布时间】:2018-10-16 17:35:36
【问题描述】:

我正在尝试释放助手。除了免费(助手)之外,一切正常。 这个函数应该检查数字是否重复。谁能帮我找出问题所在?

int check_array(int *arr, int n) {
int i, max = 0;
for (i = 0; i < n; i++)
    if (arr[i] > max) max = arr[i];

int *helper = (int*)malloc(sizeof(int) * max);
if (!helper) return;
i = 0;
while (i < max) helper[i++] = 0;
for (i = 0; i < n; i++)
    helper[arr[i]]++;

for (i = 0; i < max; i++) {
    while (!helper[i]) i++;
    if (helper[i] > 1) {
        free(helper);
        return 0;
    }
}
free(helper);

return 1;}

主要只是两个例子。

void main() {
int arr[] = { 1,2,3,4,6,7,8,9,100,120,130,140,150 };
int arr2[] = { 1,2,3,4,8,7,8,9,100,120,130,140,150 };
int size_arr = sizeof(arr) / sizeof(arr[0]);
int size_arr2 = sizeof(arr2) / sizeof(arr2[0]);

printf("arr - %d\narr2 - %d\n", check_array(arr, size_arr), check_array(arr2, size_arr2));
}

【问题讨论】:

  • 刚刚发现我的错误。问题是我分配了 max 而不是 max + 1: int helper = (int)malloc(sizeof(int) * (max + 1); 无论如何我都会把这个问题留给其他人。跨度>
  • 为了便于阅读和理解:1) 请始终缩进代码。在每个左大括号 '{' 后缩进。在每个右大括号 '}' 之前取消缩进。建议每个缩进级别为 4 个空格。 2) 遵循公理:每行只有一个语句,并且(最多)每个语句有一个变量声明。(将右大括号“}”视为单独的语句。
  • 调用任何堆分配函数时:malloccallocrealloc,1) 返回值的类型为void*,因此可以分配给任何指针。强制转换只会使代码混乱,使其更难以理解、调试等。
  • 关于:if (!helper) return; 函数 check_array() 具有指示返回类型为 int 的签名。因此,该函数的所有退出都必须返回一个值。
  • 发布的代码不完整,因此无法完全编译除其他外,发布的代码缺少所需的#include 语句。您是否希望我们“猜测”您的“真实”代码实际包含哪些内容?

标签: c malloc heap-memory dynamic-memory-allocation free


【解决方案1】:

您在调用时为max 整数分配空间

int *helper = (int*)malloc(sizeof(int) * max);

所以你只能将helper从0索引到max-1

然后你增加:helper[arr[i]]++;。但请注意,arr[i] 的至少一个值等于max。因此,您索引超出范围并写入您不拥有的内存。这会调用未定义的行为,该行为会在稍后调用free 时出现崩溃。

【讨论】:

    猜你喜欢
    • 2021-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-28
    • 2014-04-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多