如何在C中释放结构体数组

发布于 2025-01-14 18:30:47 字数 635 浏览 1 评论 0原文

我有一个像这样的结构数组

typedef struct {
    char *name[50];
    int score;
} score;

内存被分配给该数组,就像这样

score *scores = (score *) malloc(sizeof(score) * size);

我需要进行 if 检查,并且关于该检查我正在释放该内存空间。所以现在,我脑子里有两个问题:

  1. 为什么我不能像这样释放空间?
for (int i = 0; i < size; i++) {
        if (scores[i].score == scoreToBeDeleted) {
            free(scores[i].name);
            free(&(scores[i].score));
            free(&(scores[i]));
        }
    }
  1. 删除记录时是否应该移动数组的元素?

I have a struct array like this

typedef struct {
    char *name[50];
    int score;
} score;

Memory is allocated to that array like this

score *scores = (score *) malloc(sizeof(score) * size);

I need to do an if-check and regarding to that check I am deallocating that memory space. So right now, I have 2 questions in my mind

  1. Why can't I just free-up space like this ?
for (int i = 0; i < size; i++) {
        if (scores[i].score == scoreToBeDeleted) {
            free(scores[i].name);
            free(&(scores[i].score));
            free(&(scores[i]));
        }
    }
  1. Should I shift the elements of the array as I remove records ?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

羅雙樹 2025-01-21 18:30:47

您无法取消分配结构变量,因为您没有显式分配它们,而是分配了结构分数数组。

/* Allocate scores */
scores *scores[size];
for (size_t i = 0; i < size; i++) {
    /* Allocate scores individually */
    scores[i] = (score *) malloc(sizeof score);
}

/* Deallocate scores */
for (int i = 0; i < size; i++) {
        if (scores[i]->score == scoreToBeDeleted) {
            free(scores[i];
        }
    }

这样你就可以实现你想要的行为。或者您可以使用分数链接列表。

You can't deallocate your struct variables because you haven't allocated them explicitly, you have allocated the array of struct scores.

/* Allocate scores */
scores *scores[size];
for (size_t i = 0; i < size; i++) {
    /* Allocate scores individually */
    scores[i] = (score *) malloc(sizeof score);
}

/* Deallocate scores */
for (int i = 0; i < size; i++) {
        if (scores[i]->score == scoreToBeDeleted) {
            free(scores[i];
        }
    }

This way you can achieve your desired behavior. Or you could use linked list of scores.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文