ᴜsᴇ*_*sᴇʀ 3 c initialization function realloc
我的问题是'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;
}
Run Code Online (Sandbox Code Playgroud)
但是具有功能的相同程序不起作用!编译器返回以下警告:
In function ‘main’:
14:10: warning: ‘vet’ is used uninitialized in this function [-Wuninitialized]
Run Code Online (Sandbox Code Playgroud)
代码是:
#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;
}
}
Run Code Online (Sandbox Code Playgroud)
有人可以说我为什么?非常感谢你!
哦,和主要作品中的'随机'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;
}
}
Run Code Online (Sandbox Code Playgroud)
你写这篇文章的方式:
int *vet, num=10;
memoria (vet, num);
Run Code Online (Sandbox Code Playgroud)
您在其中memoria所做的更改不会被发回main.要理解这一点,只是为了好玩而改变num代替的价值,memoria然后重新检查main.main中的值仍然是10.变量vet和num值按值传递,以便保持原始值main.
围绕这两种最常见的方法是传递vetin 的地址,因此memoria可以修改它,或返回一个新值vet.
第一个表单如下所示:
memoria( & vet, num ) ;
void memoria (int **vet, int num)
{
* vet= realloc( * vet, ... ) ;
Run Code Online (Sandbox Code Playgroud)
或者,您可以更改返回类型memoria,
vet= memoria( vet, num ) ;
int * memoria( int * vet, int num)
{
...
return vet ;
}
Run Code Online (Sandbox Code Playgroud)
他们都有自己的优点和缺点.对于不是指针的人来说,第二种形式可能更容易.
malloc/realloc fluke
如果你添加printfs main并memoria显示其值,很容易看到你的上一个例子工作的原因vet.如果可以,realloc()将新内存放在与旧指针相同的位置.在您的简单测试用例中,分配器很容易这样做,因此内存保持在同一位置.如果代码更复杂,并且调用realloc()移动指针,那么之后就会看到崩溃main.
| 归档时间: |
|
| 查看次数: |
180 次 |
| 最近记录: |