我的问题是关于realloc
。
以下代码工作正常(没有警告):
#include <stdio.h>
#include <stdlib.h>
int main ()
{
int num=10;
int *vet;
int i;
for (i=0; i<num; i++)
{
/* allocate memory of vet to contains (i+1) int */
vet = (int*) realloc ( vet, (i+1) * sizeof(int) );
/* write numbers in the allocated memory */
vet[i] = 321 + i;
}
/* print test, if all works I must see:
| 321 | 322 | 323 | 324 | 325 | 326 | 327 | 328 | 329 | 330 | */
printf ("| ");
for (i=0; i<num; i++)
printf ("%d | ", vet[i]);
printf ("\n");
return 0;
}
但是同一个程序有一个功能就不行了!并且编译器返回以下警告:
In function ‘main’:
14:10: warning: ‘vet’ is used uninitialized in this function [-Wuninitialized]
代码是:
#include <stdio.h>
#include <stdlib.h>
void memoria (int *, int);
int main ()
{
int *vet, num=10;
memoria (vet, num);
/* print test, if all works I must see:
| 321 | 322 | 323 | 324 | 325 | 326 | 327 | 328 | 329 | 330 | */
int i;
printf ("| ");
for (i=0; i<num; i++)
printf ("%d | ", vet[i]);
printf ("\n");
return 0;
}
void memoria (int *vet, int num)
{
int i;
for (i=0; i<num; i++)
{
/* allocate memory of vet to contains (i+1) int */
vet = (int*) realloc ( vet, (i+1) * sizeof(int) );
/* write numbers in the allocated memory */
vet[i] = 321 + i;
}
}
有人能告诉我为什么吗?非常感谢!
哦,在主要工作中使用“随机”malloc 的相同代码(带有函数)...
#include <stdio.h>
#include <stdlib.h>
void memoria (int *, int);
int main ()
{
int *vet, num=10;
/* ADDED MALLOC */
vet = (int*) malloc (1);
memoria (vet, num);
/* print test, if all works I must see:
| 321 | 322 | 323 | 324 | 325 | 326 | 327 | 328 | 329 | 330 | */
int i;
printf ("| ");
for (i=0; i<num; i++)
printf ("%d | ", vet[i]);
printf ("\n");
return 0;
}
void memoria (int *vet, int num)
{
int i;
for (i=0; i<num; i++)
{
/* allocate memory of vet to contains (i+1) int */
vet = (int*) realloc ( vet, (i+1) * sizeof(int) );
/* write numbers in the allocated memory */
vet[i] = 321 + i;
}
}
最佳答案
你的写法:
int *vet, num=10;
memoria (vet, num);
您在 memoria
中所做的更改不要被送回main
.要理解这一点,只是为了好玩改变 num
的值而不是 memoria
然后在 main
中检查它. main 中的值仍然是 10
.变量 vet
和 num
按值传递,以便它们在 main
中保留其原始值.
解决这个问题的两种最常见的方法是传递 vet
的地址所以memoria
可以修改它,或者为 vet
返回一个新值.
第一种形式是这样的:
memoria( & vet, num ) ;
void memoria (int **vet, int num)
{
* vet= realloc( * vet, ... ) ;
或者,您可以更改 memoria
的返回类型,
vet= memoria( vet, num ) ;
int * memoria( int * vet, int num)
{
...
return vet ;
}
两者各有优缺点。第二种形式可能更容易让不是指针的人理解。
malloc/realloc 侥幸
如果您添加 printf
,您上一个示例起作用的原因很容易看出s 至 main
和 memoria
显示 vet
的值.如果可以,realloc()
将新内存放在与旧指针相同的位置。在您的简单测试用例中,分配器很容易这样做,因此内存保持在同一位置。如果代码更复杂,则调用 realloc()
移动指针,您会在 main
中看到崩溃之后。
关于c - 重新分配到函数中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21067681/