c语言自动分配内存吗,C语言为指针动态分配内存

C语言程序员要严防内存泄漏,这个“内存泄漏”就是由动态内存分配引起的。指针是C语言和其它语言的最大区别,也是很多人不能跨入C语言的一道门槛。既然指针是这么一个“危险”的坏东西,干吗不取消它呢?

其实指针本身并没有好坏,它只是一种操作地址的方法,学会了便可以发挥其它语言难以匹敌的功能,没学会的话,只能做其它语言的程序员,也同样发挥你的光和热。站长本人也在C语言门外徘徊多年,至今仍不属于高手。

变量和数组可以通过指针来转换

“int *x”中的x究竟是不是数组?光看这一句无法确定,因为它既可表示单个变量内容,也可表示数组。请理解下面的例子:

#include

int main(void){

int *num = NULL;

int *x, y[] = {12, 22,32}, z = 100;

//下面演示,指针既可充当变量、也可充当数组

x=&z; //整型变量的地址赋给x

printf("*x=%d, x[0]=%d\n", *x, x[0]);

x = y; //数组的地址赋给x

printf("*x=%d, x[ 0]=%d, x[ 1]=%d, x[2]=%d\n", *x, x[0], x[1], x[2]);

x = y + 1; //数组的第二位地址赋给x

printf("*x=%d, x[-1]=%d, x[ 0]=%d, x[1]=%d\n", *x, x[-1], x[0], x[1]);

x = y + 2; //数组的第三位地址赋给x

printf("*x=%d, x[-2]=%d, x[-1]=%d, x[0]=%d\n", *x, x[-2], x[-1], x[0]);

return 0;

}

运行结果:

*x=100, x[0]=100

*x=12, x[ 0]=12, x[ 1]=22, x[2]=32

*x=22, x[-1]=12, x[ 0]=22, x[1]=32

*x=32, x[-2]=12, x[-1]=22, x[0]=32

动态分配内存

前面讲到的指针,基本上将已经定义好的变量的地址赋给指针变量,现在要学的是向操作系统申请一块新的内存。申请到的内存,必须在某个地方手动释放,因此下面2个函数必须配对使用。malloc()和free(),都是标准函数,在stdlib.h中定义。

根据不同的电脑使用状况,申请内存有可能失败,失败时返回NULL,因此,动态申请内存时,一定要判断结果是否为空。malloc()的返回值类型是“void *”,因此,不要忘记类型转换。(许多人都省略了。)

#include

#include

#include

int main(void){

char *p ;

p = (char *)malloc(60 * sizeof(char)) ;

if (p == NULL) { //这个判断是必须的

printf("内存分配出错!");

exit(1);

}

strcpy(p, "http://see.xidian.edu.cn/cpp/u/jiaocheng/\n"); //不要忘记给新内存赋值

printf("%s", p);

free(p); //过河一定要拆桥

p = NULL ; //释放后的指针置空,这是非常好的习惯,防止野指针。

return 0;

}

运行结果:

http://see.xidian.edu.cn/cpp/u/jiaocheng/

隐蔽的内存泄漏

内存泄漏主要有以下几种情况:

内存分配未成功,却使用了它。

内存分配虽然成功,但是尚未初始化就引用它。

内存分配成功并且已经初始化,但操作越过了内存的边界。

忘记了释放内存,造成内存泄露。

释放了内存却继续使用它。

下面的程序造成内存泄漏,想想错在何处?如何修改?

#include

#include

int main(void){

int *p, i;

p = (int *)malloc(6 * sizeof(int)) ;

if (p == NULL) { //判断是否为空

printf("内存分配出错!");

exit(1);

}

for (i=0; i<6; i++) {

p++;

*p = i;

printf("%2d", *p);

}

printf("\n");

free(p); //这句运行时出错

return 0;

}

对动态内存的错误观念

有人对某一只在函数内使用的指针动态分配了内存,用完后不释放。其理由是:函数运行结束后,函数内的所有变量全部消亡。这是错误的。动态分配的内存是在“堆”里定义,并不随函数结束而消亡。

有人对某动态分配了内存的指针,用完后直接设置为NULL。其理由是:已经为NULL了,这就释放了。这也是错误的。指针可以任意赋值,而内存并没有释放;相反,内存释放后,指针也并不为NULL。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C语言中,可以使用指针来进行动态内存分配。动态内存分配是指程序运行时根据需要动态地分配内存空间,而不是在编译时静态地分配固定大小的内存。 要进行动态内存分配,可以使用C语言中的两个关键字:`malloc`和`free`。`malloc`用于申请一块指定大小的内存空间,而`free`用于释放已经申请的内存空间。 下面是一个简单的示例,演示了如何使用指针进行动态内存分配: ```c #include <stdio.h> #include <stdlib.h> int main() { int* ptr; // 定义一个指向整数类型的指针 int size; printf("请输入要分配的整数个数: "); scanf("%d", &size); // 使用malloc动态分配内存 ptr = (int*)malloc(size * sizeof(int)); if (ptr == NULL) { printf("动态内存分配失败\n"); return 1; } // 为分配的内存空间赋值 for (int i = 0; i < size; i++) { ptr[i] = i; } // 打印分配的内存空间中的值 for (int i = 0; i < size; i++) { printf("%d ", ptr[i]); } // 使用完后记得释放内存 free(ptr); return 0; } ``` 在上面的示例中,首先定义了一个指向整数类型的指针`ptr`。然后根据用户输入的个数,使用`malloc`函数动态分配了一块内存空间,并将返回的指针赋值给`ptr`。接下来,使用循环将分配的内存空间中的值进行初始化,并打印出来。最后,使用`free`函数释放了动态分配的内存空间。 需要注意的是,使用完动态分配的内存空间后,必须调用`free`函数来释放该空间,以免造成内存泄漏。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值