我应该把“free(BlockOfMemory)”放在这段代码的什么位置?

Where should I put "free(BlockOfMemory)" in this code?

提问人:AhmetPesli 提问时间:8/26/2023 最后编辑:Jonathan LefflerAhmetPesli 更新时间:8/27/2023 访问量:66

问:

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

int main() {
    int *numbers = malloc(5 * sizeof(int)); 
    // Speicherplatz auf 10 ints vergrößern
    int *temp = realloc(numbers, 10 * sizeof(int));
    if (temp != NULL) {
        numbers = temp;
        printf("Speicher erfolgreich vergrößert.\n");
    } else {
        // Fehlerbehandlung
        printf("Speicher konnte nicht vergrößert werden.\n");
        free(numbers);
        return 1;
    }
    free(numbers);

    return 0;
}

我想将我的存储从 5 个整数扩展到 10 个整数,只是为了练习。我不知道把电话“”放在哪里。free(numbers)

c malloc realloc 的自由 大小

评论

0赞 Some programmer dude 8/26/2023
当你用完(或、或)给你的内存时,当你不再需要它时,你会打电话。freemallocrealloccalloc

答:

1赞 Ted Lyngmo 8/26/2023 #1

您正在正确地释放它,就像您现在正在这样做一样。如果重新定位数据(通过返回一个不等于的指针来指示),它会自动 ,所以无论你调用多少次,你都应该只调用一次,就像你现在所做的那样。reallocreallocnumbersfree(numbers)reallocfree

1赞 Jonathan Leffler 8/27/2023 #2

稍微重新组织一下,你的代码可以这样读。它有一个对 的调用,这在某种程度上是有益的。free()

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

int main(void)
{
    int *numbers = malloc(5 * sizeof(int)); 
    int *temp = realloc(numbers, 10 * sizeof(int));
    int  rc = EXIT_SUCCESS;
    if (temp != NULL) {
        numbers = temp;    // Reassign numbers to point to the new data
        printf("Speicher erfolgreich vergrößert.\n");
    } else {
        printf("Speicher konnte nicht vergrößert werden.\n");
        rc = EXIT_FAILURE;
    }
    // If realloc succeeded, free the new value.
    // If realloc failed, free the old value.
    free(numbers);

    return rc;
}

一旦调用并返回非空指针 in ,就不应再次尝试使用最初存储在 中的值。只有当返回空指针时,才应调用 .分配成功后,代码会将新指针复制到旧指针上,因此不会(滥用)使用旧值。realloc(numbers, new_size)tempnumbersrealloc()free(numbers)

因此,您的代码是正确的。

评论

0赞 AhmetPesli 9/25/2023
我只是想感谢你这个伟大而详细的回答。我忘了我问了这个问题,但现在我读了它,你准确地说出了我需要什么。