指向指针的指针+ 值传递的理解

//17、下面的程序会出现什么结果 
#include  
#include  
void getmemory(char *p) 
{ 
p=(char *) malloc(100); 
strcpy(p,”hello world”); 
} int main( ) 
{ 
char *str=NULL; 
getmemory(str); 
printf(%s/n”,str); 
free(str); 
return 0; 
} 
// 程序崩溃,getmemory中的malloc 不能返回动态内存, free()对str操作很危险 

你上面提供的程序会导致运行时错误,具体原因如下:

1. 函数 getmemory 中的内存分配

getmemory 函数中,你尝试通过 malloc 分配内存并将其赋值给 p

void getmemory(char *p) 
{ p = (char *) malloc(100); strcpy(p, "hello world"); 
}
  • 这里的 p 是一个局部变量,传递给它的指针 strmain 函数中是 NULL
  • 当你调用 malloc 时,确实分配了 100 字节的内存,但这只改变了 p 的值,原始的 str 指针在 main 函数中仍然是 NULL。函数结束后,p 被销毁,分配的内存的指针没有被保存。

2. main 函数中的操作

main 函数中,str 仍然是 NULL

int main() 
{ char *str = NULL; getmemory(str); printf("%s/n", str); // 这里 str 仍然是 NULLfree(str); // 释放 NULL 的内存,虽然是安全的,但没有释放有效的内存return 0; 
}
  • 当你调用 printf("%s", str); 时,str 仍然是 NULL,这将导致未定义行为,程序可能会崩溃。
  • 之后的 free(str); 调用虽然是安全的(释放 NULL 指针是安全的),但它不会释放任何有效的内存,因为 str 仍然是 NULL

3. 如何修复

如果你想让 getmemory 函数修改 str,你需要将 str 的地址传递给 getmemory。可以使用指向指针的指针:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>void getmemory(char **p) 
{ *p = (char *) malloc(100); strcpy(*p, "hello world"); 
}int main() 
{ char *str = NULL; getmemory(&str); // 传递 str 的地址printf("%s\n", str); free(str); return 0; 
}

总结

  • 原始程序会导致崩溃,因为内存分配的结果没有返回给 main 中的 str
  • 通过传递指向指针的指针,可以使内存分配的结果有效地传回并使用。

指针和引用
python传参的值传递

让我们通过一个简单的例子来说明值传递和引用传递(或指针传递)之间的区别。

1. 值传递的例子

在 C 语言中,默认的参数传递方式是值传递。当你将一个变量传递给函数时,实际上是将该变量的副本传递过去,函数内对该副本的修改不会影响原始变量。

#include <stdio.h>void modifyValue(int a) {a = 10; // 这里只改变了 a 的副本
}int main() {int a = 3;printf("Before: a = %d\n", a); // 输出: 3modifyValue(a); // 传递 a 的值printf("After: a = %d\n", a);  // 输出: 3 (未改变)return 0;
}
输出:
Before: a = 3
After: a = 3

2. 指针传递的例子

如果你想要在函数中修改原始变量的值,你需要传递该变量的地址。这时,你可以使用指针来实现。

#include <stdio.h>void modifyValue(int *p) {*p = 10; // 通过指针修改原始变量的值
}int main() {int a = 3;printf("Before: a = %d\n", a); // 输出: 3modifyValue(&a); // 传递 a 的地址printf("After: a = %d\n", a);  // 输出: 10 (已改变)return 0;
}
输出:
Before: a = 3
After: a = 10

总结

  • 值传递:在 modifyValue(int a) 中,amain 函数中 a 的副本。对 a 的修改不会影响原始变量。

  • 指针传递:在 modifyValue(int *p) 中,pa 的地址,*p 允许你通过指针修改原始变量 a 的值。

通过这种方式,你可以看到传递变量的值和地址(指针)所产生的不同效果。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/884581.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

持续改进之路:运维中的常见挑战及解决方案

在运维工作中,团队经常会遇到各种各样的挑战。这些挑战不仅影响系统的稳定性和性能,还可能导致服务中断,影响用户体验。本文将通过具体案例,详细解析运维中常见的挑战,并提供相应的解决方案,帮助读者更好地理解和应对这些问题。 案例一:服务器过载导致服务中断 问题描…

【c++篇】:掌握vector基础知识--基本操作与使用全知道

✨感谢您阅读本篇文章&#xff0c;文章内容是个人学习笔记的整理&#xff0c;如果哪里有误的话还请您指正噢✨ ✨个人主页&#xff1a;余辉zmh–CSDN博客 ✨文章所属专栏&#xff1a;c篇–CSDN博客 文章目录 前言一.vector的基本概念1.定义2.主要特性和优点 二.vector的基本操作…

windows C#-对象

类或结构定义的作用类似于蓝图&#xff0c;指定该类型可以进行哪些操作。 从本质上说&#xff0c;对象是按照此蓝图分配和配置的内存块。 程序可以创建同一个类的多个对象。 对象也称为实例&#xff0c;可以存储在命名变量中&#xff0c;也可以存储在数组或集合中。 使用这些变…

基于SSM+微信小程序的订餐管理系统(点餐2)

&#x1f449;文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1、项目介绍 基于SSM微信小程序的订餐管理系统实现了管理员和用户。管理端实现了 首页、个人中心、用户管理、菜品分类管理、菜品信息管理、订单信息管理、配送信息管理、菜品评价管理、订单投诉管理、…

基于Opencv的图像处理软件

本文所涉及所有资源均在 传知代码平台 可获取。 目录 一、背景及意义介绍 背景 意义

机器学习周报(RNN的梯度消失和LSTM缓解梯度消失公式推导)

文章目录 摘要Abstract 1 RNN的梯度消失问题2 LSTM缓解梯度消失总结 摘要 在深度学习领域&#xff0c;循环神经网络&#xff08;Recurrent Neural Network, RNN&#xff09;被广泛应用于处理序列数据&#xff0c;特别是在自然语言处理、时间序列预测等任务中。然而&#xff0c…

equal和==的比较

equal是一个方法&#xff0c;用于比较两个对象的值是否相等。 是一个运算符&#xff0c;用于比较两个对象的引用是否相等。 在Java中&#xff0c;对于基本数据类型&#xff0c;用于比较它们的值是否相等。而对于引用类型&#xff0c;比较的是对象的引用是否相等&#xff0c;即…

Mastercam2025软件安装教程+MC2025中文安装包下载

一、软件下载 【软件名称】&#xff1a;MasterCAM 2025 【支持系统】&#xff1a;win10/win11 【百度网盘】&#xff1a;https://pan.baidu.com/s/12fY66cwRLGcKdeVoJ40ZRw?pwd70zi 二、Mastercam软件 Mastercam是美国 CNC Software 公司开发的一款 CAD/CAM 软件。它集二维…

[vulnhub] DC: 8

https://www.vulnhub.com/entry/dc-8,367/ 描述&#xff1a;在 Linux 上安装和配置双因素身份验证是否可以防止 Linux 服务器被利用 端口扫描主机发现 探测存活主机&#xff0c;179是靶机 nmap -sP 192.168.75.0/24 Starting Nmap 7.94SVN ( https://nmap.or…

【Rust标准库中的convert(AsRef,From,Into,TryFrom,TryInto)】

Rust标准库中的convert&#xff08;AsRef&#xff0c;From&#xff0c;Into&#xff0c;TryFrom&#xff0c;TryInto&#xff09; 为什么需要convert库AsRef&#xff08;不可变引用&#xff1a;多用于内部字段获取值&#xff09;From/Into Trait | TryFrom/TryInto TraitFrom T…

自扶正救生艇,保障水上救援的安全卫士_鼎跃安全

在应急事件中&#xff0c;自扶正救生艇能够发挥关键的救援和保障作用&#xff0c;确保救援人员和被困人员的生命安全&#xff0c;尤其在极端天气或突发水上事故中展现出明显优势。 在救援过程中如果遭遇翻船&#xff0c;救生艇能够迅速恢复正常姿态&#xff0c;确保救援人员不会…

提升网站安全性 HTTPS的重要性与应用指南

内容概要 在如今数字化快速发展的时代&#xff0c;网站安全显得尤为重要。许多用户在访问网站时&#xff0c;尤其是涉及个人信息或金融交易时&#xff0c;对数据传输的安全性有着高度的关注。HTTPS&#xff08;超文本传输安全协议&#xff09;正是为了满足这种需求而诞生的。通…

QT——自定义控件绘图

一.QPaintEvent绘图事件 QPaintEvent是QT中一个重要的类&#xff0c;专门用于绘图事件。当QT视图组件需要重绘制自己的一部分时&#xff0c;就会产生该事件&#xff0c;通常发生在以下几种情况。 窗口第一次显示时&#xff1a;当窗口或控件第一次出现在屏幕中&#xff0c;系统…

【jvm】Minor GC

目录 1. 说明2. JVM内存结构2.1 年轻代2.2 老年代2.3 永久代/元空间 3. 工作原理4. 触发条件5. 影响6. 优化策略 1. 说明 1.minor是较小的、较少的、次要的含义。2.在Java虚拟机中&#xff0c;Minor GC是指针对于年轻代&#xff08;Young Generation&#xff09;进行的垃圾回收…

【Python · Pytorch】人工神经网络 ANN(上)

【Python Pytorch】人工神经网络 ANN&#xff08;上&#xff09; 0. 生物神经网络1. 人工神经网络定义2. 人工神经网络结构2.1 感知机2.2 多层感知机2.3 全连接神经网络2.4 深度神经网络 2. 训练流程※ 数据预处理 (Data Preprocessing) 3. 常见激活函数3.1 Sigmoid / Logisti…

【Redis_Day2】在Linux中安装Redis5

本篇涉及Linux中的三条指令&#xff1a;su&#xff1b;apt&#xff1b;vim&#xff0c;可以了解后再来浏览本篇。或在评论留言。 【Redis_Day2】在Linux中安装Redis5 安装修改配置文件使用redis-cli连接服务器 安装 Linux版本选择Ubuntu22.04 Redis版本选择Redis5 登录Ubunt…

第1篇 引言

一、AIGC概念 1、AIGC定义 AIGC&#xff0c;即生成式人工智能&#xff08;Artificial Intelligence Generated Content&#xff09;&#xff0c;是指利用人工智能技术自动生成或辅助创作内容的过程和结果。 简单来说&#xff1a;过去&#xff0c;写文章、画张图、唱首歌、弄个…

深度学习---------------------------------Transformer

目录 Transformer架构多头注意力有掩码的多头注意力基于位置的前馈网络层归一化信息传递预测总结代码多头注意力使用多个头并行计算选择缩放点积注意力作为每一个注意力头测试该部分总代码Transformer基于位置的前馈网络改变张量的最里层维度的尺寸对比不同维度的层归一化和批量…

世界时区划分

1. AoE &#xff08;Anywhere on Earth&#xff09;代表地球上最后一个时区的时间&#xff0c;是全球范围内最晚的时间&#xff0c;通常用于截止日期。 2. UTC/GMT &#xff08;协调世界时/格林威治时间&#xff09;是全球的标准时间&#xff0c;所有时区都是基于UTC计算的。…

qt QImage详解

1、概述 QImage是Qt框架中用于处理图像数据的一个核心类。与QPixmap不同&#xff0c;QImage是在内存中直接存储图像像素数据的&#xff0c;这使得它适用于需要直接访问和修改像素的应用场景&#xff0c;比如图像处理算法、图像绘制以及图像分析等。QImage支持多种图像格式&…