重新分配到函数中

2024-02-19

我的问题是关于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 and num按值传递,以便它们保留其原始值main.

解决这个问题的两种最常见的方法是传递地址vet in so 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 侥幸

如果您添加的话,您上一个示例起作用的原因很容易看出printfs to main and memoria来显示的价值vet。如果可以的话realloc()将新内存放在与旧指针相同的位置。在您的简单测试用例中,分配器可以轻松执行此操作,因此内存保留在同一位置。如果代码更复杂,并且调用realloc()移动指针,您会看到崩溃main after.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

重新分配到函数中 的相关文章

  • 双线性序列给出奇数结果

    我试图让我的表现技能 不存在 达到标准 但在将公式写入代码时遇到了问题 这是我试图将其引用为 转换 为代码的公式 考虑一个序列 u 其中 u 定义如下 号码u 0 1是第一个u 对于每个x in u then y 2 x 1 and z 3
  • C语言中的递归是如何工作的?

    我试图了解 C 中递归的工作原理 任何人都可以给我解释控制流吗 include
  • 宏可以按参数数量重载吗?

    如何this https stackoverflow com q 9183993 153285工作 如何实现 C99 C 11 可变参数宏以仅根据为其提供多少个参数来扩展到不同的事物 编辑 请参阅末尾以获得现成的解决方案 要获得重载的宏 首
  • Confuser .NET 混淆器。安全吗? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我目前正在开发一个应用程序 其中阻止用户反编译代码非常重要 现在 我意识到 如果由经验丰富的程序员执行 大多数 exe 都是可反编译的
  • C++:将模板参数的模板类型成员添加为好友的正确语法?

    我有一个带有模板类型参数 tTRAIT 的类 我想加一个模板为好友type member aliastTRAIT 但我无法弄清楚语法 这可能吗 template
  • 在 C++ 中使用表达式模板进行符号微分

    如何在 C 中使用表达式模板实现符号微分 一般来说 您需要一种表示符号的方法 即编码的表达式模板 例如3 x x 42 以及一个可以计算导数的元函数 希望您对 C 中的元编程足够熟悉 知道这意味着什么和需要什么 但可以给您一个想法 This
  • 读取STM32 MCU SPI数据寄存器的值

    有很多类似的问题 但似乎没有一个问题完全相同 我正在将 STML4 MCU 连接到 6 轴传感器 LSM6DS3 我已经成功地在 I2C 中实现了所有内容 但想要 SPI 的额外速度 和 DMA 如果我能让这些第一步工作起来的话 因此 第一
  • 是否有一种算法可以在线性时间内计算数组反转?

    我知道有多少倒转 en wikipedia org wiki Inversion 28discrete mathematics 29 in an n 元素数组可以在 O n log n 操作使用增强型归并排序 http www geeksf
  • ASP.NET MVC 路由 - 向路由添加 .html 扩展名

    我对 MVC 和路由非常陌生 我被要求修改一个应用程序以使用不同的 url 由于我没有经验 这项任务对我来说有点困难 好吧 让我们谈谈一些代码 routes MapRoute CategoryBySeName Route name prod
  • Visual Studio Code 调试默认 ASP.NET Core MVC WebApp:不起作用

    我正在使用 Manjaro linux 并尝试调试默认的 ASP NET Core MVC 项目 但调试停止 没有任何错误 我创建了该项目 dotnet new mvc in a Meow文件夹 没什么特别的 然后添加了新的配置 NET C
  • 使用 QGraphicsScene 实现流畅的动画

    我希望我的问题并不总是同样的问题 我有一个 QGraphicsScene 它的项目是一些 QGraphicsPixmap 我用一个计时器来移动它们 每秒 SetX 10 我设置 10是因为窗口大100 使用这个解决方案我的动画不流畅 我想我
  • printf() 使用字符串表“解码器环”调试库

    我写这封信是想看看你们中是否有人见过或听说过我即将描述的想法的实现 我有兴趣为嵌入式目标开发 printf 风格的调试库 目标非常遥远 并且我和目标之间的通信带宽预算非常紧张 因此我希望能够以非常有效的格式获取调试消息 通常 调试语句如下所
  • 只读有运行时开销吗?

    出于某种原因 我一直认为readonly字段有与其相关的开销 我认为这是 CLR 跟踪是否存在readonly字段是否已初始化 这里的开销是一些额外的内存使用量 用于跟踪状态以及分配值时的检查 也许我这么认为是因为我不知道readonly字
  • 带有自定义鉴别器的 EntityFramework Code First 继承

    我正在尝试在 EntityFramework Code First 中映射以下继承 public class Member public string ProjectName get set public string AssemblyNa
  • SQL参数化查询不显示结果

    我的 DataAcess 类中有以下函数 但它没有显示任何结果 我的代码如下 public List
  • 如何解决内存碎片

    我们偶尔会遇到这样的问题 长时间运行的服务器进程 在 Windows Server 2003 上运行 由于内存分配失败而引发异常 我们怀疑这些分配由于内存碎片而失败 因此 我们一直在寻找一些可能对我们有帮助的替代内存分配机制 我希望有人能告
  • char* argv[] 在 c/c++ 中如何工作? [复制]

    这个问题在这里已经有答案了 我知道它用于使用命令行中的参数 但我没有得到声明 字符 argv 它是否意味着指向 char 数组的指针 如果是的话为什么没有大小 如果不是动态数组 就不需要有大小吗 我做了一些研究 发现有人说它会衰减为 cha
  • 如何在 Winform DataGridView 中创建不同的单元格格式

    我有一个 DataGridView 我将其绑定到 DataTable DataTable 是一个全数字值 要求 DataGridView 中的每 n 行都包含文本 而不是数值 以便在视觉上为用户分隔部分 我很高兴在绑定后将此文本数据放入 D
  • 获取会议组织者邮件地址 EWS API

    我想使用 EWS API 获取会议组织者的邮件地址 目前 我刚刚获得约会项目的一些属性 我听说你可以设置你想要获取哪些属性 我的代码看起来像这样 CalendarView cview new CalendarView start end c
  • 如何在没有 Visual Studio 的情况下将新文件添加到 .csproj 文件

    如何添加新文件到 csproj从命令提示符 我认为没有任何工具可以响应命令行上的 add project 命令来执行此操作 但我认为您可以幸运地创建一个程序 脚本来直接操作 csproj 文件的 XML 内容 csproj 文件的结构如下所

随机推荐

  • UITableView titleForHeaderInSection 显示全部大写

    我正在使用 titleForHeaderInSection 显示 UITableView 部分的标题 它在 iOS6 SDK 中工作得很好 但 iOS7 SDK 显示的标题全部大写 我猜这是苹果更新的人机界面指南的一部分 那里的所有示例都显
  • Oracle Merge 删除子句其中数据在目标中但不在源中

    尝试从目标表中删除源表中不存在的记录 对象类型 CREATE OR REPLACE type dbo P REC AS OBJECT ATTR1 VARCHAR2 64 BYTE ATTR2 VARCHAR2 128 BYTE ATTR3
  • Tkinter - 如何将实例变量传递给另一个类?

    我用谷歌搜索了很多 但没有成功 上周发布了一个问题 但没有答案 因为似乎太长了 希望新问题更加清晰 这只是一小段代码 如果您运行它 您将能够重现该问题 我基本上需要做的是获取用户输入 来自 mainGUI 类的 E1 并将其传递给数据库类中
  • Firebase 数据库中“加载文档时出错”

    我在尝试访问时遇到错误Database内的菜单项Firebase 控制台 这是一个新的数据库 实际上有几条数据记录 但屏幕一直旋转很长时间 然后返回消息 加载文档时出错 同时我可以访问验证菜单项没有任何问题 Note 我使用的是配备 Cat
  • yii 执行自定义命令时出错

    当我运行自定义时 出现以下错误yiic终端中的命令 我似乎无法找出此错误的原因 任何人都可以指出我正确的方向 我知道数据库工作正常 应用程序的其他部分工作正常
  • 这段简单的代码的复杂性是多少?

    I m pasting this text from an ebook I have It says the complexity if O n2 and also gives an explanation for it but I fai
  • XSLT:没有属​​性且没有子元素的元素转换为父属性

    给定 xml 文件的结构 名称和值未知 对于每个具有简单结构 没有子节点 没有属性 但有文本且不为空 的非根元素 将其转换为父级的属性 我有 xml 文件
  • 房间和可用日期 PHP/MySQL

    因此 我正在设计一个适用于酒店的 Web 应用程序 它最终应该成为通过一些额外代码为每个酒店网站安装的简单方法 该应用程序是使用 php 和 mysql 因此 正如您可能猜到的那样 我对数据库结构非常困惑 不过 我做了一些研究 我不仅仅是要
  • Git clean 被忽略的文件夹

    我有一个文件夹foo包含在 gitignore 中 gitignore this contains foo foo bar 当我跑步时git clean f or git clean f x 这不会删除bar bar是一个普通文件 有没有办
  • boto3.Bucket.upload_file 是阻塞还是非阻塞?

    Is boto3 Bucket upload file http boto3 readthedocs io en latest reference services s3 html S3 Bucket upload file阻塞还是非阻塞
  • 插入多对多关系表

    简单场景 ClientTable ClientId ClientName Phone Age CityTable CityID CityName Country ClientCityTable ClientCityID ClientID C
  • 如何在 html 文本区域中显示以下文本?

    我有一个如下所示的字符串 请看一下 我把它作为图像 这里也不显示 如果我将该字符串放在这里 它就会变成以下内容 21154537878887GHE u0044 u0045 现在我的问题是 有没有办法将原始字符串放入 HTML 中
  • 有什么方法可以从 lme4 mer 模型拟合对象生成 LaTeX 表吗?

    有谁知道如何从 lme4 生成一个好的出版质量的 LaTeX 表mer目的 既没有xtable方法 包xtable 也不latex方法 包Hmisc 知道如何处理mer对象 例如 考虑到这种拟合 library lme4 fm1 lt lm
  • 如何更改 Rails 应用程序数据?

    我看过很多关于 ActiveRecord 迁移以及是否应该使用它们来更改应用程序中的数据的讨论 有些人说是 有些人说不 我的问题是 如果您不使用迁移来执行此操作 那么您使用什么 只是你写的另一个脚本 我正在寻求有关替代方法的建议 以及为什么
  • 观察 Linux 内核中的变量(内存地址)变化,并在变化时打印堆栈跟踪?

    我想以某种方式 监视 Linux 内核 确切地说是内核模块 驱动程序 中的变量 或者内存地址 并找出改变它的原因 基本上 当变量改变时打印出堆栈跟踪 例如 在内核模块中testjiffy hr c列于末尾这个答案 https stackov
  • 如何访问在单独的 Web 应用程序中实现远程接口的 EJB?

    我正在使用 Netbeans 6 8 和 Glassfish v3 0 我创建了一个 ejb 模块并从数据库创建了实体类 然后创建了具有远程接口的无状态会话 bean 比如说 Remote public interface customer
  • 是否可以在 GHCi 中定义新的 ADT

    在评论 ghci 的新功能时 我希望 ghci 能够声明类型声明并声明新的 ADT 类型 有人告知这确实是可能的 经过搜索我发现这一页 https stackoverflow com questions 3093133 how to pro
  • ASP.NET Core - 从智能手机远程访问

    我尝试通过计算机的 IP 地址配置对 ASP NET Core 应用程序的访问 每当我尝试通过智能手机访问网站时 都会收到错误消息ERR CONNECTION TIMED OUT 我完全按照 Stack Overflow 上许多类似问题 答
  • 了解 NodeJS 和非阻塞 IO

    所以 我最近被注射了 Node 病毒 该病毒在编程世界中传播得非常快 我对它的 非阻塞 IO 方法着迷 并且自己也确实尝试了几个程序 但是 我目前无法理解某些概念 我需要外行人的回答 来自 Java 背景的人 1 多线程和非阻塞IO 让我们
  • 重新分配到函数中

    我的问题是关于realloc 以下代码可以正常工作 没有警告 include