c - 重新分配到函数中

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

最佳答案

你的写法:

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

两者各有优缺点。第二种形式可能更容易让不是指针的人理解。

ma​​lloc/realloc 侥幸

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

关于c - 重新分配到函数中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21067681/

相关文章:

c# - 如何在没有循环的情况下在 c# 中初始化类的 'NotNull' 数组?

c - C中有调节背景颜色的函数吗? (实际上是一个Dos命令)

c - 使用关键字 'struct' 声明结构对象并在 malloc 中

c - 在 C 语言中使用 getopt() 的 if 语句中的 True 和 False

r - 向量化简单格式化函数以处理带有 NA 的向量

javascript - 此 CodeSchool 示例中如何使用 ".shift()"方法?

java - 不使用 getDeclaredMethod 接收 Java 方法

c++ - 创建结构 vector ,保留空间,C++

c - 如何在不释放它指向的数据指针的情况下释放 skb 缓冲区?

javascript - 为什么使用命名函数表达式?