Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 避免指针问题的最佳实践_C_Pointers - Fatal编程技术网

C 避免指针问题的最佳实践

C 避免指针问题的最佳实践,c,pointers,C,Pointers,与指针相关的程序员错误的实际结果是什么 当程序员创建指针错误时会产生什么“坏影响” 最好使用带有代码的实际示例。归根结底,这就是访问未指定给它的内存区域。在分配区域外读/写,取消对未初始化指针的引用。基本上就是这样 也存在对指向的对象类型的错误解释,但这通常需要一些努力才能避免被编译器责骂 内存泄漏,但情况不同,这是关于分配,而不是指针本身。 从 我想我是从字面上理解了说明请求。当指针被误用时,可能会出错的事情: 内存泄漏-您在方法中分配指针,然后让它超出范围,而没有正确地解除分配它。指向堆上内

与指针相关的程序员错误的实际结果是什么

当程序员创建指针错误时会产生什么“坏影响”


最好使用带有代码的实际示例。

归根结底,这就是访问未指定给它的内存区域。在分配区域外读/写,取消对未初始化指针的引用。基本上就是这样

也存在对指向的对象类型的错误解释,但这通常需要一些努力才能避免被编译器责骂

内存泄漏,但情况不同,这是关于分配,而不是指针本身。


我想我是从字面上理解了说明请求。

当指针被误用时,可能会出错的事情:

  • 内存泄漏-您在方法中分配指针,然后让它超出范围,而没有正确地解除分配它。指向堆上内存的指针现在丢失,但内存仍保持分配状态。释放这些内存现在非常困难

  • 访问冲突-您创建的指针指向您无权访问或不存在的内存地址。指针毕竟只是整数,可以像任何其他数字一样进行操作。当您尝试取消引用无效指针时,程序将停止

  • 空指针错误-这是访问冲突的特殊情况。正确的方法是将指针的值设置为零或null,这样指针就不会指向任何特定的对象。试图取消对空指针的引用将使程序停止

  • 缓冲区溢出-为30个字符的字符缓冲区分配指针。然后继续将用户输入(从套接字、文件、控制台等)流式传输到此缓冲区。如果未能正确实现缓冲区边界检查,则程序可能会将30多个字符放入缓冲区。这将损坏内存中缓冲区附近存储的任何数据,并可能使您遭受恶意代码攻击

  • 内存损坏-指针只是一个整数,包含它指向的对象的内存地址。作为一个整数,可以用各种有趣的方式操纵指针的值。如果指针计算出错,可能会出现细微的错误。指针现在将指向内存中的某个未知位置,当它被取消引用时,任何事情都可能发生

  • 以Null结尾的字符串问题-当期望以Null结尾的字符串的字符串库函数被输入非以Null结尾的字符指针时,就会出现这些错误。字符串库函数将继续处理字符,一次处理一个字符,直到找到空值——不管它在哪里


  • 我不知道你是否还能做到这一点,但我记得几年前,我们编写了一个脚本,通过清除整个RAM使系统崩溃。我们就是这样做的

    int *i;
    
    while(1){
       *i = 0;
       i++;
    }
    

    至少我记得我们是这样做的。不过,我相信它现在不会起作用。

    只要初始化指针变量,良好的清理将消除99%的问题。我指的是良好的清洁;释放内存并将指针变量设置为null


    否则,您需要一个关于指针的传递以及负责清理内存的代码的清晰设计。如果您最终不知道什么代码将是最后一个使用内存的代码&应该清理,那么您就有了一种设计气味,为了保持理智,您需要对其进行修复。

    原始指针是有害的。无法知道它们是否有效(悬空指针),它们是否已被初始化(如果在初始化时未设置为NULL,它们可能会显示为实际指向某个对象),并且不清楚谁有责任释放它们指向的资源(例如,调用方检索或函数返回指针)

    没有聪明的指针我一天也活不下去。std::auto_ptr当我转移所有权时(明确责任),boost::shared_ptr当所有权被共享时,boost::weak_ptr当只有人“观察”资源时。

    • 千万不要忽视任何警告
    • 使用like

    • 最重要的是:使用-他们经常警告指针的不正确使用,打破数组边界,等等“我确保在这些方面没有错误,即使程序似乎正在工作


      • 取消引用错误指针时的结果是未定义的,因此根据定义当指针出错时,任何事情都可能发生。这就是为什么尽可能避免使用它们的原因

        C-ish语言是围绕指针的使用而设计的,它们现在占主导地位,所以对一些人来说,这听起来像是疯狂的建议。我建议人们研究那些设计用来最小化指针使用和检查常见错误的语言,比如Ada

        我最喜欢的指针轶事如下:我曾在佛罗里达州的一个小组工作,该小组在新墨西哥州的库尔特兰空军基地(大部分在大陆的另一边)对3架太阳神探测器进行了网络飞行模拟。有一天突然出现了一个崩溃错误。当地的现场技术人员无法修复它,所以大约一个月后,我们的一名工程师乘飞机过来查看。两周后,他感到困惑,于是又有一个人被拉了进来。又过了一个月,我们的高级工程师也被派去帮忙了

        又过了一个月(公司一直在支付3人的住宿费、租车费和每两个周末飞回来的费用),他们发现了这个问题。结果是有人在索引数组末尾的一个(C也没有索引检查)。然后,他们抓起那个位置的垃圾,通过网络将其传递给第二台机器,而这台机器正在使用那个值