动态内存分配问题!!!
注:动态内存分配将改变指针的地址!
原因
当我们用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语言时遇到的问题,以及后来解决该问题所了解到的内容,希望对大家有所帮助,若有存在不正确的地方,请大家指出,谢谢!