Realloc成为一个函数

时间:2014-01-11 20:47:53

标签: c function initialization 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;
}

但是带有功能的相同程序不起作用!编译器返回以下警告:

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;
    }
}

3 个答案:

答案 0 :(得分:6)

你写这篇文章的方式:

int *vet, num=10;

memoria (vet, num);

您在memoria内所做的更改不会被发送回main。要理解这一点,只是为了好玩,更改num而不是memoria的值,然后在main中进行检查。 main中的值仍为10。变量vetnum按值传递,以便将原始值保存在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 fluke

如果您将printf添加到mainmemoria以显示vet的值,则很容易看到您的上一个示例有效的原因。如果可以,realloc()将新内存放在与旧指针相同的位置。在您的简单测试用例中,分配器很容易这样做,因此内存保持在同一位置。如果代码更复杂,并且对realloc()的调用移动了指针,那么您将在main之后看到崩溃。

答案 1 :(得分:2)

照顾好这几个问题,你就可以了。

您的main没有找到实际指向某事物的vetvet。

main vet

相应地更改原型以返回指针并记住在定义中返回int *vet = NULL; //better bet for realloc() in this case vet= memoria (vet, num);

vet

现在到int* memoria(int*, int); 。符合ISO C

  

如果ptr是realloc()null pointer应相当于realloc()   对于指定的大小。

     

如果ptr与之前calloc()返回的指针不匹配,   malloc(),或malloc()或此空间先前已取消分配   通过调用realloc()free(),行为未定义。

希望有所帮助。

答案 2 :(得分:1)

你正在通过一个未经初始化的兽医*来重新分配。 Realloc()就像free(),以防它分配全新的内存(free()是旧的分配)。所以传递给realloc()的任何指针最好是有效的堆指针或空指针。