你能不能从一个函数的内部在C中重新定位一个内存块?
因此,在编写程序时,我意识到当在main之外的函数中使用realloc时,如果原始内存块在main中声明,它似乎不会将更改保留在函数之外。 例如 我是否需要做一些不同的事情,或者这项工作可以吗? 此外,这只是示例代码,不打算运行 额外信息你能不能从一个函数的内部在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
我在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);