【为什么】指针,动态内存的例子

#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)。

new bing提供的解决办法:

#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运算符来释放它所占用的内存空间。
这样就避免了悬空指针和未定义行为的问题。

原文中的解决办法:

#include <stdio.h>

int *pPointer;

void SomeFunction()
{
// make pPointer point to a new integer
    pPointer = new int;
    *pPointer = 25;
}

void main()
{
    SomeFunction(); // make pPointer point to something
    printf("Value of *pPointer: %d\n", *pPointer);

    delete pPointer;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值