首页 > 系统相关 >指针,动态内存的例子

指针,动态内存的例子

时间:2023-02-18 11:33:06浏览次数:38  
标签:pPointer int nNumber 例子 动态内存 new SomeFunction 指针

#include <stdio.h>

int *pPointer;

void SomeFunction();
{
    int nNumber;
    nNumber = 25;    

    // make pPointer point to nNumber:
    pPointer = &nNumber;
}

void main()
{
    SomeFunction(); // make pPointer point to something

    // why does this fail?
    printf("Value of *pPointer: %d\n", *pPointer);
}

这个程序的问题:
您没有正确地初始化指针变量pPointer,这可能导致它指向一个无效或随机的内存地址。
您在SomeFunction函数中让pPointer指向一个局部变量nNumber,但是当该函数结束后,nNumber就会被销毁,而pPointer就会成为一个悬空指针(dangling pointer),也就是指向一个已经释放的内存区域。
您在main函数中试图打印*pPointer的值,但是由于pPointer是一个悬空指针,这可能导致未定义行为(undefined behavior),例如程序崩溃或错误输出。
要解决这些问题,您可以尝试以下几个方法:

在声明指针变量时,给它赋一个初始值NULL或nullptr,以表示它不指向任何有效的内存地址。
如果您想让pPointer指向SomeFunction函数中的一个变量,并且在该函数结束后仍然有效,那么您可以使用动态内存分配(dynamic memory allocation),例如使用new运算符来创建一个int类型的对象,并返回它的地址给pPointer。但是请注意,在使用完该对象后,您需要使用delete运算符来释放它所占用的内存空间,以避免内存泄漏(memory leak)。
如果您不想使用动态内存分配,那么您也可以将nNumber定义为一个静态变量(static variable),这样它就不会在SomeFunction函数结束后被销毁,而是一直存在于程序的生命周期中。但是请注意,在多线程环境下使用静态变量可能会导致竞争条件(race condition)或数据不一致(data inconsistency)。

解决办法:

#include <stdio.h>

int *pPointer; // declare a pointer variable

void SomeFunction();
{
    int *nNumber; // declare a pointer to int
    nNumber = new int; // allocate memory for an int object using new
    *nNumber = 25; // assign 25 to the int object

    // make pPointer point to nNumber:
    pPointer = nNumber;
}

void main()
{
    SomeFunction(); // make pPointer point to something

    // print the value of *pPointer:
    printf("Value of *pPointer: %d\n", *pPointer);

    delete pPointer; // free the memory allocated by new
}

在SomeFunction函数中,我使用了new运算符来为一个int类型的对象分配一块内存空间,并将它的地址赋给nNumber指针。然后我将25赋给该对象,并让pPointer指向nNumber。
在main函数中,我打印了*pPointer的值,并在使用完该对象后,使用了delete运算符来释放它所占用的内存空间。
这样就避免了悬空指针和未定义行为的问题。

标签:pPointer,int,nNumber,例子,动态内存,new,SomeFunction,指针
From: https://www.cnblogs.com/wozhuyinghao/p/17132231.html

相关文章

  • 顺序不同,含义不同的几个例子
    在任何一门语言中,词语的位置和顺序对句子意思表达都是至关重要的。即文本是时序型数据,词与词之间的顺序关系往往影响整个句子的含义。例一国民党元老、大书法家于右任曾......
  • 智能指针 shared_ptr weak_ptr shared_from_this 笔记
    图片来自std::enable_shared_from_this有什么意义?-孔洽孔洽的回答-知乎https://www.zhihu.com/question/30957800/answer/2700292012答案参考一下,应该不完全对当......
  • 为什么C++既有指针又有引用?
    C++从C继承了指针,所以我不能在不导致严重的兼容性问题的情况下删除它们。引用在很多方面都很有用,但我在C++中引入它们的直接原因是为了支持运算符重载。例如:void......
  • java jna框架免注册调用大漠插件及指针参数方法调用
    大漠dll说明1、dm.dll为com类型组件。2、DmReg.dll免注册为常规dll。学习研究时的历程1、因为大漠是com组件,所以可以使用jacob调用大漠。但是不支持免注册dll的使......
  • 1.双指针
    1.双指针目录1.双指针1.1什么是双指针1.2对撞指针15.三数之和1.3快慢指针83.删除排序链表中的重复元素82.删除排序链表中的重复元素II1.1什么是双指针双指针,指......
  • WebAPI例子
    1.WebApiConfig配置API路由usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Web.Http;namespaceWebAPIDemo1{publicstatic......
  • 指针类型
    指针声明TypeTmingRi=^integer;vars1.s2:^string;s3:string;beginnew(s1);new(s2);s1^:='MingRiSoft';s2^:='kaihongliu';s1:=s2;......
  • D. Moving Dots(组合数学,贡献,二分/双指针)
    题目https://codeforces.com/contest/1788/problem/D思路从题目给的“2”这个信息入手,从贡献这个方面来考虑对于任意两不同的点,具有一定的范围,让这个范围内的点都被......
  • 字符指针与字符数组的复习
    遇到的刷题题目,给定sec秒,将其转换为时分秒输出,规定了函数形式为char*timeTrans(intsec)且需要返回修改的字符串首地址#include<stdio.h>char*timeTrans(intsec,c......
  • 关于指针Splay
    关于指针Splay目录关于指针Splay更好的阅读体验戳此进入写在前面操作核心节点UpdateGetDirRotateSplayInsertFindDeleteFindRankByValFindValByRankFindPreFindNxtCodeTOD......