C++/C编程:指针参数传递内存解析

需积分: 49 7 下载量 41 浏览量 更新于2024-08-06 收藏 638KB PDF 举报
"指针参数是如何传递内存的?-浙大电气复试题目荟萃" 在C++编程中,函数参数的传递通常分为传值和传引用两种方式。当函数的参数是一个指针时,我们实际上是在传递这个指针的值,而不是它所指向的对象。在示例7-4-1中,`GetMemory`函数尝试通过指针参数`p`来分配内存,但这种做法并未改变调用者(`Test`函数)中`str`指针的值。 `GetMemory(char *p, int num)`函数内部的`p = (char *)malloc(sizeof(char) * num);`这行代码仅改变了局部变量`p`的值,即在函数内部创建了一个新的指针,指向了新分配的内存。然而,由于指针是按值传递的,这个改变不会影响到`Test`函数中的`str`指针。因此,当`Test`函数调用`GetMemory`后,`str`仍然是NULL,导致后续的`strcpy(str, "hello");`操作成为运行错误,因为它试图复制字符串到一个未初始化的内存区域。 为了正确地通过指针参数传递内存,我们需要使用引用来传递。这样,函数内部对指针的修改将会影响到调用者。正确的做法是使用指针的引用或指针的指针: ```cpp void GetMemory(char *&p, int num) { p = new char[num]; } void Test() { char *str = NULL; GetMemory(str, 100); // 现在str会指向新分配的内存 strcpy(str, "hello"); // 正确的使用 } ``` 在这个修复后的版本中,`GetMemory`函数接受一个指针引用,这意味着它能够直接修改调用者中的`str`指针,使其指向新分配的内存。因此,`str`现在不再为NULL,可以安全地用于字符串拷贝。 在内存管理中,了解如何正确地使用指针是非常重要的,尤其是涉及到动态内存分配和释放。`malloc`和`free`是C语言中的内存分配和释放函数,而`new`和`delete`是C++中的对象构造和析构机制。它们各自有自己的使用场景,例如,`new`可以用于构造对象并自动调用构造函数,而`malloc`仅分配内存,不执行任何构造操作。同时,使用`new`和`delete`可以更好地与对象生命周期管理相结合,避免内存泄漏和悬挂指针的问题。 理解指针参数的传递机制以及内存管理的基本原则,是编写高质量C++/C代码的关键。在编程实践中,应始终注意内存安全,避免未初始化的指针、内存泄漏和野指针等问题。通过遵循良好的编程习惯,如使用智能指针、及时释放内存和避免过度复杂的内存操作,可以显著提高代码的可靠性和可维护性。