当我们使用未初始化的内存指针时,会导致程序无法进行,因为指针并没有指向一个合法的地址,这时候其内部存的只是一些乱码。所以在调用函数时,会使用乱码所指的内存,指针根本就无权访问,导致出错。
看一段代码
#include<stdio.h>
void getvalue(float x, float y, float* sum);
int main()
float a, b;
float* sum;
scanf_s("%f%f", &a, &b);
getvalue(a, b, sum);
return 0;
void getvalue(float x, float y, float* sum)
float sum1;
sum1 = x + y;
sum = &sum1;
printf("两者之和是%.2f\n ", *sum);
会出现

解决办法是为指针动态分配内存,之后再将其释放
看代码怎么解决
#include<stdio.h>
void getvalue(float x, float y, float* sum);
int main()
float a, b;
float(*sum) = malloc(100);
scanf_s("%f%f", &a, &b);
getvalue(a, b, sum);
free(sum);
return 0;
void getvalue(float x, float y, float* sum)
float sum1;
sum1 = x + y;
sum = &sum1;
printf("两者之和是%.2f\n ", *sum);

博客记录成长
当我们使用未初始化的内存指针时,会导致程序无法进行,因为指针并没有指向一个合法的地址,这时候其内部存的只是一些乱码。所以在调用函数时,会使用乱码所指的内存,指针根本就无权访问,导致出错。看一段代码#include<stdio.h>void getvalue(float x, float y, float* sum); //计算两个浮点数的和int main(){ float a, b; float* sum; scanf_s("%f%f", &a, &b); g
C++中的引用和指针
★ 相同点: 1. 都是地址的概念;指针指向一块内存,它的内容是所指内存的地址;引用是某块内存的别名(java中的引用其实也是别名的意思)。
★ 区别: 1. 指针是一个实体,而引用仅是个别名;2. 引用使用时无需解引用(*),指针需要解引用;3. 引用只能在定义时被初始化一次,之后不可变;指针可变; 引用“从一而终” 4. 引用没有 const,指针有 const,const 的指针不可变;5. 引用不能为空,指针可以为空;6. “sizeof 引用”得到的是所指向的变量(对象)的大小,而“sizeof 指针”得到的是指针本身(所指向的变量或对象的地址)的大小;type
二、常见的错误有几种:
1)内存分配未成功,却使用了它
编程新手常犯这种错误,因为他们没有意识到内存分配会不成功。常用解决办法是,使用内存之前检查指针是否为Null。
如果指针p是函数的参数,那么在函数的入口处用assert(p != NULL)进行检查。如果使用malloc或new来申请内存,应该用if(p == NULL)或if(p != NULL)进行放错处理。
2)内存分配虽然成功,但是尚未初始化就引用它
犯这种错误主要有个起因:一是没有初始化的观念;二是误以为内存的缺省初值全为零,导致引用初值错误(eg. char
智能指针(smart pointer)是存储指向动态分配(堆)对象指针的类,用于生存期控制,能够确保自动正确的销毁动态分配的对象,防止内存泄露。它的一种通用实现技术是使用引用计数(reference count)。智能指针类将一个计数器与类指向的对象相关联,引用计数跟踪该类有多少个对象共享同一指针。每次创建类的新对象时,初始化指针并将引用计数置为1;当对象作为另一对象的副本而创建时,拷贝构造函数拷贝指针并增加与之相应的引用计数;对一个对象进行赋值时,赋值操作符减少左操作数所指对象的引用计数(如果引用计数为减至0,则删除对象),并增加右操作数所指对象的引用计数;调用析构函数时,构造函数减少引用计
之前在学Java的时候对于Java虚拟机中的内存分布有一定的了解,但是最近在看一些C,发现居然自己对于C语言的内存分配了解的太少。
问题不能拖,我这就来学习一下吧,争取一次搞定。在任何程序设计环境及语言中,内存管理都十分重要。
内存管理的基本概念
分析C语言内存的分布先从Linux下可执行的C程序入手。现在有一个简单的C源程序hello.c
1 #include <stdio....