我的问题是’realloc’。 以下代码正常工作(没有警告):
#include #include 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; }
但是具有function的相同程序不起作用! 并且编译器返回以下警告:
In function 'main': 14:10: warning: 'vet' is used uninitialized in this function [-Wuninitialized]
代码是:
#include #include 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相同的代码(使用该function)……
#include #include 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 ; }
他们都有自己的优点和缺点。 对于不是指针的人来说,第二种forms可能更容易。
malloc / realloc fluke
如果你将printf
添加到main
和memoria
以显示vet
的值,你很容易看到你的上一个例子工作的原因。 如果可以, realloc()
将新内存放在与旧指针相同的位置。 在您的简单测试用例中,分配器很容易这样做,因此内存保持在同一位置。 如果代码更复杂,并且对realloc()
的调用移动了指针,那么你将看到main
的崩溃。
照顾好这几个问题,你很高兴。
你的main
没有找到实际指向某事的vet
。 以某种方式将vet
送回main vet
。
int *vet = NULL; //better bet for realloc() in this case vet= memoria (vet, num);
相应地更改原型以返回指针,并记住在定义中返回vet
。
int* memoria(int*, int);
现在来realloc()
。 符合ISO C标准
如果ptr是
null pointer
,则realloc()
应等于指定大小的malloc()
。如果ptr与之前由calloc(),
malloc()
或realloc()
返回的指针不匹配,或者如果先前已通过调用free()
或realloc()
释放空间,则行为未定义。
希望有所帮助。
你正在通过一个未经初始化的兽医*来重新分配。 Realloc()就像free(),以防它分配全新的内存(free()是旧的分配)。 所以传递给realloc()的任何指针最好是有效的堆指针或空指针。
以上就是c/c++开发分享重新分配成一个函数相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/541777.html