你能不能从一个函数的内部在C中重新定位一个内存块?

你能不能从一个函数的内部在C中重新定位一个内存块?,c,pass-by-reference,dynamic-memory-allocation,realloc,C,Pass By Reference,Dynamic Memory Allocation,Realloc,因此,在编写程序时,我意识到当在main之外的函数中使用realloc时,如果原始内存块在main中声明,它似乎不会将更改保留在函数之外。 例如 我是否需要做一些不同的事情,或者这项工作可以吗? 此外,这只是示例代码,不打算运行 额外信息 我在windows 10上使用MinGW您将类型为int**的表达式&ptr传递给函数 exampleFunction(&ptr); void exampleFunction(int *ptr) 但函数参数的类型为int* void example

因此,在编写程序时,我意识到当在main之外的函数中使用realloc时,如果原始内存块在main中声明,它似乎不会将更改保留在函数之外。 例如

我是否需要做一些不同的事情,或者这项工作可以吗? 此外,这只是示例代码,不打算运行

额外信息
我在windows 10上使用MinGW

您将类型为
int**
的表达式
&ptr
传递给函数

exampleFunction(&ptr);
void exampleFunction(int *ptr)
但函数参数的类型为
int*

void exampleFunction(int *ptr)
因此,函数声明及其调用没有意义

您必须至少像这样声明和定义函数

//this function reallocates the memory block of ptr
void exampleFunction( int **ptr)
{

    *ptr = realloc( *ptr, (sizeof(int) * 10));

}
尽管最好在调用
realloc
时使用临时指针,因为函数可以返回
NULL
。在这种情况下,
*ptr
的原始值将丢失

所以你应该像这样声明函数

//this function reallocates the memory block of ptr
int exampleFunction( int **ptr)
{
    int *tmp = realloc( *ptr, (sizeof(int) * 10));

    int success = tmp != NULL;

    if ( success ) *ptr = tmp;

    return success;

}

你可以这样写

void main()
{

    int *ptr;

    //allocates memory
    ptr = calloc(4, sizeof(int));

   ptr= exampleFunction(ptr);

}

int * exampleFunction(int *ptr)
{
    ptr = realloc(ptr, (sizeof(int) * 10));
  return(ptr);
}

这回答了你的问题吗?尝试使程序保持0(零)个警告。现在你有警告,不读它们,但更愿意寻求帮助。因此,正如我在原始帖子中所说的,这是示例代码,而不是我的实际代码,我想确保这是一个可行的事情,我可以做你是正确的:这是一个可行的替代解决方案。。。但它忽略了OP尝试传递
&ptr
(OK)。。。但随后未能a)将参数声明为
int**ptr
,b)分配给
*ptr=realloc(…)
(因此出现错误)。是的,先生,我知道这一点。。我只是想给出一个简单的解决方案,谢谢你纠正我@FoggyDayI我更喜欢这个地址如果我诚实的话,它是sympler,尽管另一个的错误检查很好,我已经知道怎么做了,这并不是我想要的。好吧,那么你需要解除引用,然后传回新地址?我以前曾向某人提出过这个建议,但他们说我不能这么做。@PaulGeoghegan如果你想更改函数中的一个对象,那么你需要通过引用来传递它,在C中,这意味着传递一个指向该对象的指针。如果要更改函数中的指针ptr,必须传递指向该指针ptr的指针,例如exampleFunction(&ptr);