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

简介: 【为什么】指针,动态内存的例子
#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;
}
相关文章
|
8月前
|
存储 Java C++
C++ 引用和指针:内存地址、创建方法及应用解析
C++中的引用是现有变量的别名,创建时需用`&`运算符,如`string &meal = food;`。指针存储变量的内存地址,使用`*`创建,如`string* ptr = &food;`。引用必须初始化且不可为空,而指针可初始化为空。引用在函数参数传递和提高效率时有用,指针适用于动态内存分配和复杂数据结构操作。选择使用取决于具体需求。
113 9
|
8月前
|
存储 Go iOS开发
掌握Go语言:探索Go语言指针,解锁高效内存操作与动态数据结构的奥秘(19)
掌握Go语言:探索Go语言指针,解锁高效内存操作与动态数据结构的奥秘(19)
|
5月前
|
存储 C语言
指针和动态内存分配
指针和动态内存分配
109 0
|
2月前
|
存储 C语言
C语言如何使用结构体和指针来操作动态分配的内存
在C语言中,通过定义结构体并使用指向该结构体的指针,可以对动态分配的内存进行操作。首先利用 `malloc` 或 `calloc` 分配内存,然后通过指针访问和修改结构体成员,最后用 `free` 释放内存,实现资源的有效管理。
161 13
|
2月前
|
存储 C语言 开发者
C 语言指针与内存管理
C语言中的指针与内存管理是编程的核心概念。指针用于存储变量的内存地址,实现数据的间接访问和操作;内存管理涉及动态分配(如malloc、free函数)和释放内存,确保程序高效运行并避免内存泄漏。掌握这两者对于编写高质量的C语言程序至关重要。
63 11
|
2月前
|
存储 算法 程序员
C 语言指针详解 —— 内存操控的魔法棒
《C 语言指针详解》深入浅出地讲解了指针的概念、使用方法及其在内存操作中的重要作用,被誉为程序员手中的“内存操控魔法棒”。本书适合C语言初学者及希望深化理解指针机制的开发者阅读。
|
2月前
|
存储 C语言 计算机视觉
在C语言中指针数组和数组指针在动态内存分配中的应用
在C语言中,指针数组和数组指针均可用于动态内存分配。指针数组是数组的每个元素都是指针,可用于指向多个动态分配的内存块;数组指针则指向一个数组,可动态分配和管理大型数据结构。两者结合使用,灵活高效地管理内存。
|
2月前
|
容器
在使用指针数组进行动态内存分配时,如何避免内存泄漏
在使用指针数组进行动态内存分配时,避免内存泄漏的关键在于确保每个分配的内存块都能被正确释放。具体做法包括:1. 分配后立即检查是否成功;2. 使用完成后及时释放内存;3. 避免重复释放同一内存地址;4. 尽量使用智能指针或容器类管理内存。
|
5月前
|
存储 安全 Go
Go 中的指针:了解内存引用
Go 中的指针:了解内存引用
|
6月前
|
运维
开发与运维数组问题之指针的加减法意义如何解决
开发与运维数组问题之指针的加减法意义如何解决
50 7