动态内存分配问题!!!

文章解释了动态内存分配如何改变指针地址,通过示例展示了当空指针分配内存后,指针会指向新的堆内存地址。在函数调用中,如果未正确传递内存分配后的地址,会导致段错误。修正代码的方法是让函数返回动态分配的内存地址,并将其赋值给原始指针。
摘要由CSDN通过智能技术生成

动态内存分配问题!!!

注:动态内存分配将改变指针的地址!

原因

当我们用malloc或new类似的函数动态分配内存时,它会返回一个指向新分配内存的指针(地址改变了!)

例如

int *a=NULL;//定义一个空指针
printf("%p\n",a);//输出0000000000000000
a=(int *)malloc(sizeof(int))//为该指针分配动态内存
printf("%p\n",a);//输出0000017939006390

这里的原因是:

当我们使用空指针分配动态内存时,实际上会将一段堆内存分配给指针,并将指针指向这段分配的内存空间!!!(指针重新指向了!它不再指向NULL)

例题

问:以下代码会输出什么?

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

void getspace(char *p)
{
	p=(char *)malloc(100);
	strcpy(p,"hello world");	//copy字符串的一个函数
}

int main()
{
	char *s=NULL;	//定义一个空指针s
	getspace(s)		//传入s的值(这里有行不改实的内容,需要了解“值”的含义)
	printf("%s\n",s);	//打印字符串s
	free(s);			//释放s
	return 0;			
}

答案:

输出:

段错误!

原因:

传入s的,即一个地址,这里是NULL

传入参数(NULL)后

为形参p分配一个100字节大小的空间

此时!返回回来的形参指向的地址和原来指向的地址是不一样的

也就是说此时p指向的地址变化了与 s指向的地址并不相等

然后copy “hello world” 给p指向的地址里的内容(此时p是一个动态数组)

执行完这个操作后

打印s,s还是空,报段错误(因为s的值并未改变还是NULL)(行不改实)

修正代码!

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

char * getspace(char* p)
{
	p = (char*)malloc(100);
    if (p != NULL) 	//分配成功则copy,否则返回p
    {
        strcpy(p, "hello world");	//copy字符串的一个函数
    }
	return p;	//返回p指向的地址
}

int main()
{
	char* s = NULL;	//定义一个空指针s
	s = getspace(s);		//将p指向的地址赋值给s,也就是令 s指向 p指向的地址
     if (s != NULL) 	//分配成功则copy,否则返回p
    {
		printf("%s\n", s);	//打印字符串s
    }
	free(s);			//释放s
	return 0;
}

这样就可以把分配内存后变换的地址传回给s了

若分配内存成功则输出:

hello world



以上是本人在学习c语言时遇到的问题,以及后来解决该问题所了解到的内容,希望对大家有所帮助,若有存在不正确的地方,请大家指出,谢谢!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值