gpt4 book ai didi

c - 无效的 realloc/realloc 返回 NULL

转载 作者:行者123 更新时间:2023-12-02 07:01:30 26 4
gpt4 key购买 nike

在一个函数中我使用了 malloc :

void name1(struct stos* s)
{
s = malloc (4 * sizeof (int));
}

一切正常。但是后来我用了realloc

void name2(struct stos* s)
{
s->size = 2*(s->size);
s = realloc (s, (s->size + 1) * sizeof (int));
}

我在 valgrind 中得到无效的 free/delete/realloc 并且 realloc 返回 NULL。

结构声明和程序的其余部分是:

struct stos
{
int top;
int size;
int stk[];
};

void name1(struct stos* s);
void name2(struct stos* s);

int main()
{
struct stos stosik;
struct stos* s;
s = &stosik;

name1(s);

//some operations on the array and int top here

name2(s);
}

我这里做错了什么?我寻找了很长时间可能出了什么问题,阅读了很多关于指针、malloc/realloc 等的文章,但没有结果。如果有人能帮助我,我将不胜感激。

最佳答案

这个问题有点微妙,是由两件事共同造成的。让我们从这里开始:

struct stos stosik;
struct stos* s;
s = &stosik;

name1(s);

首先,您使 s 指向分配在堆栈 (stosik) 上的有效内存块,然后调用 name1 传递到 s。让我们看看 name1 长什么样:

void name1(struct stos* s)
{
s = malloc (4 * sizeof (int));
}

嗯,我们可以看到 name1 接受了一个指向名为 sstruct stos 的指针;在该函数内部,我们正在分配一些内存并使 s 指向它。这是一个问题。

首先,请注意s 已经指向一个有效的内存块。所以在这里使用 malloc 是可疑的。它会导致一个微妙的错误,实际上会隐藏程序中的真正的错误,这很糟糕。所以,让我们完全删除 stosik:

int main()
{
struct stos* s = NULL;

name1(s);

if(s == NULL)
return -1;

现在,如果你运行这个程序,你会看到在调用 name1 之后,变量 s 仍然指向 NULL。这里发生了什么?

好吧,我们正在更改函数的 LOCAL s 副本(即仅存在于 name1 中的 s >)...但是 main 中的 s 没有改变!请记住,我们将指针传递给 name1,但我们是按值传递它。

要完成您似乎想做的事,您必须将指向s指针 传递给name1(也就是说,传递一个双指针)或者你应该从 name1 返回 malloc 的结果作为返回值。让我们看看这些选项中的每一个:

通过双指针传入

void name1(struct stos **s)
{
/* sanity check */
if(s == NULL)
return;

/* now, allocate enough space for four integers and make
* whatever s points to, point to that newly allocated
* space.
*/
*s = malloc(4 * sizeof(int));
}

main 调用它需要我们使用“address-of”运算符:

struct stos *s = NULL;

/* we need to pass a pointer to s into name1, so get one. */
name1(&s);

/* malloc can fail; check the result! */
if(s == NULL)
return -1;

name1

返回指向已分配内存的指针
struct stos *name1()
{
return malloc(4 * sizeof(int));
}

main 调用它稍微容易一些:

struct stos *s = name1();

/* malloc can fail; check the result! */
if(s == NULL)
return -1;

将您的代码更改为我在这里向您展示的代码将解决此问题(但可能还有其他问题),但让我简要谈谈其他事情:

另一个错误

您遇到的崩溃部分是由于我们刚刚提到的问题造成的;另一个问题是在 name2 中您正在调用 realloc。但是,您传递给 realloc 的指针不是您从 mallocrealloc 返回的指针,后者是 realloc 所期望的。它指向 stosik。所以该代码会导致未定义的行为,之后任何事情都可能发生。

如果你很幸运(看起来你很幸运),它会立即崩溃,如果你不是......好吧,谁知道会发生什么?

关于c - 无效的 realloc/realloc 返回 NULL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20013368/

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