如何为作为函数参数传入的NULL指针赋值?
问题分析与解决
你的代码存在三个关键问题,导致段错误和预期不符:
内存分配大小错误
malloc(sizeof(test*))分配的是指针的大小(通常4或8字节),但你需要的是整个test结构体的大小,应该改为malloc(sizeof(test))。用new更符合C++规范:test* x = new test;。指针传值无法修改外部变量
函数insert的参数test* t是按值传递的,你在函数内修改t = x只是修改了局部变量,不会影响外部的a。要修改外部指针,需要传递指针的指针或者指针的引用。解引用NULL指针
因为a始终是NULL,main里的a->val会直接触发段错误。
解决方法1:使用指针的指针
修改函数参数为test** t,通过二级指针修改外部指针:
#include <iostream> using namespace std; struct test { int val; }; void insert(test** t, int value) { // 用new替代malloc更符合C++习惯 test* x = new test; x->val = value; *t = x; // 解引用二级指针,修改外部指针的值 } int main() { test* a = NULL; insert(&a, 5); // 传入指针的地址 cout << (a->val) << endl; delete a; // 记得释放内存,避免泄漏 }
解决方法2:使用指针的引用
C++支持引用,直接传递指针的引用,修改时会直接作用于外部变量:
#include <iostream> using namespace std; struct test { int val; }; void insert(test*& t, int value) { // 指针的引用 test* x = new test; x->val = value; t = x; // 直接修改外部指针 } int main() { test* a = NULL; insert(a, 5); // 直接传指针 cout << (a->val) << endl; delete a; }
额外提示
- 如果你坚持用
malloc,记得分配正确的大小,C++中malloc返回的void*可以自动转换,无需强制类型转换:test* x = malloc(sizeof(test)); - 动态分配的内存记得用
delete(对应new)或free(对应malloc)释放,避免内存泄漏。
内容的提问来源于stack exchange,提问作者Jonas
相关产品推荐
相关产品推荐

