C语言指针到底有多危险

作者: python找小新分类: 校园学习 发布时间: 2023-03-28 09:41:22 浏览:143445 次

C语言指针到底有多危险

An_Andy_dy:
Java明确删除指针,但是到处都是指针[doge]

【回复】回复 @冰馬 :Java在大部分情况是慢过C的,但是Java更安全,开发速度更快,但是Java运行时又需要编译成本地机器码
【回复】引用和指针区别还是很大的
【回复】回复 @A4的钉子 :哈哈哈,平均10个视频见它一次,当时第一次见是热力学,后来看它到处各种领域基础级别逆天发言就不敢和它争了[笑哭]但凡它多说对几条我也把它当工科学得好的,现在应该是经典级偏下的民科了[笑哭]
沕丂:
可是老是说过,只要学会c,其他语言学起来就像喝水一样,不学有不成,难搞[笑哭]

【回复】没必要,C里面有很多知识,在其它语言里面用不到。学其它语言,没学过C也不影响的。 运用方向不一样的,看你优先想做什么工作。 如果目前只想打基础,学习,那可以从C开始,但要准备花更多的时间。
【回复】回复 @风铃舞乐 :不完全对,学过c的人很难不带固有印象地去理解lisp和haskell,这就像是练了阳五雷就练不了阴五雷一样。 不过你说学不学,那还是要学的,毕竟C都学不明白,其他的你说你会了,可能只是你以为你会了。反正等到要用别的语言的时候自然而然会散功的。
【回复】搞c语言的一般要么是大佬,要么就是菜狗
Jancean_:
指针哪里难了?不就是个保存内存地址这种数据的变量么,指针操作无非就是地址偏移进行寻址。讲C语言前就应该讲一讲内存管理的概念,老师能理解透彻能通俗清晰地给学生讲明白就一点不难。天天给学生搞指针难的刻板印象,搞得学生提前厌学害怕C语言

【回复】指针牵扯的东西信息量有点大,比如泛型指针 快慢指针 指针函数 函数指针 数组指针 指针数组 多级指针等等知识(我声明有些概念的实质不是指针,没有一概而论为指针),想吃透这些东西靠理解力是可以做到的,但是新手能不能坚持学下去并且不被搞糊涂就有点难了,这就是指针的“难”吧
【回复】回复 @CastleKin :其实线程 进程这些概念在实际的操作系统中可能并不如此明确,比如linux操作系统里准确来讲没有线程的概念,经过分离(detach)出去的线程一般都是操作系统调度的,实际上就是新的进程,而且linux源代码里也几乎没有用process这个词去描述进程,取而代之的是任务task(比如linux里的PCB叫task_struct) 协程是并发调度,一个协程是单线程的,但往往可以开多个协程绑定到不同CPU核心上运行,但无论是单线程还是多线程,无论是真并行还是分时并发,都是要进行并发调度的(而且也只有非真并行才需要上下文切换调度,如果整台计算机只有两个线程分别运行在不同核心上那就没有低级调度的必要) 在linux中C语言可以通过setjmp和longjmp实现协程,但是这两个函数本身就是系统调用,它们的底层实现仍然要依靠汇编指令去进行上下文切换,你可以去找找课程,除了setjmp和longjmp,C语言基本上也只能通过嵌入或者调用汇编指令完成用户态上下文切换
【回复】回复 @码界菜鸟 :不是难不难的问题 而是内存安全的问题 项目里面设计程序需要确保不会造成内存泄露 野指针空指针等问题 这就是难点 后来c++11也加入了智能指针 可以通过赋值来延长生命周期 rust也有类似的(box rc)
Moviecoding:
指针啥的,学完汇编语言再来看指针就是弟弟,哈哈哈

【回复】手抠二进制,你们弱爆了[doge]
【回复】汇编只有底层没有感情[吃瓜]
【回复】学了FPGA,汇编什么就是弟弟[doge]
Steven20001018:
并不是直接操作内存吧?操作本身还是虚拟地址,中间不还有重映射隔离物理地址吗?(不是学计科的科班出身 求轻喷qwq)

【回复】正确的,当然要看目标平台,像初学者编译的目标平台一般是x86 protected mode或amd64 long mode,都是有重映射的。像那些比较简陋的单片机,或者是8086 real mode这种没有操作系统的环境就是真的在操作物理地址
【回复】所以可以简单理解为直接操作物理地址。毕竟计算机一整个学科最重要的思想就是抽象,向上层隐藏细节[吃瓜]
【回复】正确的,视频说了一堆废话,完全不顾操作系统的内存映射啥的,这就是个卖课的,说一堆废话又具有误导性,纯粹洗脑。
嘉然我要当你的狗:
在这里我要提一个内存安全的底层语言[doge]

【回复】你说的对,但是rust是由mozilla自主研发的一款全新内存安全底层语言。编译器安装于一个被称作“rustup”的版本管理工具,在这里,被定义的变量将被授予“生命周期”,引导自动析构。你将扮演一位名为“码农”的神秘角色,在海量的代码中邂逅性格各异,能力独特的引用和智能指针们,和他们一起击败强敌,找回变量的所有权------同时,逐步发掘borrowed after move的真相
【回复】一个不写Rust的人,有两种可能性。一种是没有能力写Rust。因为买不起PC或装不上rustup等各种自身因素,他的人生都是失败的,第二种可能:有能力却不写Rust的人,在有能力而没有写Rust的想法时,那么这个人的思想境界便低到了一个令人发指的程度。一个有能力的人不付出行动来证明自己,只能证明此人行为素质修养之低下。是灰暗的,是不被真正的程序员认可的。
【回复】它是由一个浏览器闻名的公司创造,它与一个数据库项目具有紧密联系,它抛弃了许多主流工业语言的特性,比如函数重载和oop。
大佐-煤吸:
难的是内存管理,因为我们大部分都是操作的堆内存,怎么安全的管理他们。指针本身并不复杂

【回复】回复 @大佐-煤吸 :哈哈哈遇到这种情况我只能上调试器 而且出问题的代码还不一定是要改的代码[笑哭] (A代码给指针赋值,B代码使用偏移量访问内存,然后炸了)
【回复】回复 @是沐叶呐 :139段错误 哈哈哈 一脸懵逼,还不知道哪行代码出问题了[吃瓜]
【回复】指针没管好的话天天给我访问非法内存
nullFind:
我记得java并不是删除了指针,是把指针封装成了引用

【回复】可以这么看,创建一个类,相当于用malloc分配了一些内存,最后将地址作为引用返回
【回复】只是常规方法没法用指针,搬 unsafe 包出来一样当指针用
【回复】回复 @SH_qsIHS :并不是,全量gc后如果有触发内存整理的话,对象在托管堆里的位置是会变的,不过jvm会把引用目标地址同步挪过去,所以用户一般感受不到地址变化
苍穹玥夜:
我给你们解释一下:小区共有六个单元,叫012345。你只要说出小区号和单元号就可以叫出那个单元里的人。问题来了,c语言允许叫这个小区的6单元,会叫出隔壁小区并列的那栋楼的人。你永远不知道那里有没有楼,是哪个小区,住着什么鬼。

挣点圆子:
所以要学操作系统。有些内存你是碰不到的

【回复】回复 @冰馬 :cpu特权模式下的有些寄存器用户模式不能访问
【回复】回复 @strawberrydance :但已有团队在开发 Redox OS ,基于Rust语言实现内存安全
【回复】回复 @叫声是哔哔哩 :大多数软件和操作系统不都是有一些厂商自己都没发现的软件问题嘛,如果问题正好严重到可以任意执行代码,那这个漏洞就会被拿到黑客中间进行交易,告诉一个漏洞收多少费用。当然很多这种都是非法的
我是空虚呀:
其实指针并不难,将几维指针分别指向什么关系搞清楚就行

【回复】不就是个地址吗 一看汇编就算懂了
清澈的勇气yc:
为什么this只是一个指针却能访问类的所有成员呢老师

【回复】这个不可访问是逻辑上不可访问,物理上可以访问的,你可以用指针强制让私有成员在对象外访问。比如你创建某个类名称为class1,和成员i,构造对i赋值,写一个函数void f(void* a){ *(class1**)((__int64)&a -8) =(class*)a;cout<<i;//输出i },再2个实例对i初始化不同数字,然后用f传递另一个实例指针。看看效果(debug测试,release需要关闭代码优化),这个f函数第一句按照参数a的物理地址-8得到this的地址,只是指向指针的指针,这个值被修改为a。
【回复】回复 @薄命书生笑红尘 :不是二级指针,如果有二级指针的话,就要开辟存放指针的内存,对象大小就和实际不符,事实上是通过对this指针偏移来实现对成员变量的访问,变量存放的顺序是类中声明变量的顺序。
【回复】回复 @清澈的勇气yc :内存就长这样啊,用地址访问具体的地方,什么对象不都在内存里嘛,都拿到地址了我稍微加一下不就到成员变量的地址了吗,然后就是把内存那一块的东西取出来或者写入,或者叫访问,具体的什么权限之类的都是逻辑上的东西,规定的,你能的话可以自己写编译器实现来改规定,也是可以的
幸运女武神:
今天个大链表,输出是对的,总是报非法访问。看了俩小时想了想是不是非法访问了,初始化null妈的又跑得动了[呆]

【回复】回复 @冰馬 :可能是重复全局变量名,导致每个调用函数赋值不符和该对象的对应值,null虽然不占用内存,但会请求所需内存数量,直接使用全局变量是很危险的(至少在我看来),直接调用函数会有内存清除机制
【回复】回复 @吃西瓜吗x :然后跟链表有何关系?
【回复】回复 @冰馬 :他不一定是const,也可能是局部变量声明
G24v1ty:
c编程初衷就是默认你是个合格的成员员,对你写的代码非常了解,知道代码做了些什么,所以才给你最大的灵活度,但是事实就是不是所有人都能达到这个水平,c要想写得好得对计算机底层非常的了解,内存,cpu,kernel,而不是简单的写个排序算法、点个灯就算会c了

C语言 IT 计算机 C++ 编程 危险 指针

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!