gpt4 book ai didi

c - Malloc 不在 C 中分配内存

转载 作者:太空宇宙 更新时间:2023-11-04 01:23:06 26 4
gpt4 key购买 nike

我正在尝试构建一个获取 (**group, *count) 的函数其中 count 是数组中项目的数量,group 是指向数组的指针。

我必须使用 **group 而不是更简单的 *group

编辑:根据要求我包含了我的main() func:

int *group1, **pgroup1, count1 = 0, *pcount1;
pgroup1 = &group1;
printf("please enter what size do you want the array to be..\n");
scanf("%d", &count1);
pcount1 = &count1;
BuildGroup(pgroup1, pcount1);

void BuildGroup(int** group, int* count)
{
int i = 0, j = 0, c = *count;
group = (int**)malloc(c*sizeof(int**));
if (group == NULL)
{
printf("ERROR: Out of memory\n");
return 1;
}
printf("please enter the %d items in the array...\n", *count);
for (i = 0; i < *count; i++) //going through the array items to be filled.
{
scanf("%d", &group[i]);
for (j = 0; j < i; j++)
{
while (group[i] == group[j]) //checking every item if he is already in the group,if he is in the group prompting the user for re-entering.
{
printf("you've entered the same value as beforehand, please enter this value again..\n");
scanf("%d", &group[j]);
}
}
}
}

我不知道为什么 malloc 没有分配数组所需的内存。另一方面,它不会触发 if (==null) 所以我真的不知道我做错了什么。

最佳答案

看起来你传递给函数的(或者实际上,应该传递给函数)是一个指向指针变量的指针,然后你应该在函数中使用解引用来访问指针变量。

像这样:

int *group;
int count = 10;
BuildGroup(&group, &count);

这意味着你的函数应该看起来像

void  BuildGroup(int **group, int *count)
{
if ((*group = malloc(*count * sizeof(**group))) == NULL)
{
// Failed to allocate memory
return;
}

printf("Please enter the %d items in the array...\n", *count);

for (int i = 0; i < *count; ++i)
{
scanf("%d", *group + i);
// `*group + i` is the same as `&(*group)[i]`

... inner loop here...
}
}

我真的不明白为什么 count 参数是一个指针,除非函数真的应该设置它。


关于正在发生的事情的一点解释

main 函数中,您有一个指针变量,groups。您想要分配内存并将指向该内存的指针分配给 group 变量。很简单,就是这样

group = malloc(N * sizeof(*group));

问题来了,因为你想在另一个函数中分配内存,这是一个问题,因为当你将参数传递给函数时,它是按值完成的,这意味着值是 copied 并且函数内部的参数变量只是一个副本。修改副本当然不会修改原件。

如果 C 可以将 group 变量通过引用传递给函数,这个问题就可以解决,这意味着在函数内部,参数变量将引用 main 函数中的变量。不幸的是,C 没有按引用传递语义,它只有按值传递。这可以通过使用指针模拟按引用传递来解决。

当您将指针传递给函数时,它是按值传递并被复制的指针,尝试将指针更改为指向其他地方是徒劳的,因为它只会更改指针的本地副本。但是,我们可以更改它指向 的数据,这是使用取消引用运算符* 完成的。传递指向某些数据的指针是使用寻址运算符 & 完成的。

根据以上信息,如何模拟按引用传递指针?就像任何其他变量一样,通过使用寻址运算符将指针传递给指针变量。在函数内部,我们然后使用解引用运算符访问原始指针变量。

更形象地说,它可以是这样的:

+--------------------------------+| &group (in main function)      | -\+--------------------------------+   \  +--------------------------+    +-----+                                      > | group (in main function) | -> | ... |+--------------------------------+   /  +--------------------------+    +-----+| group (in BuildGroup function) | -/+--------------------------------+

关于c - Malloc 不在 C 中分配内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36835348/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com