动态内存的开辟

c程序的内存分配:

执行程序会将程序加载到内存,内存大体上被分为三个区:栈段、堆段、数据段(全局变量和static变量)

 

 栈:局部变量和形式参数会保存在栈区,函数调用完之后,释放栈帧和函数中的局部变量。

堆:堆区空间远大于栈区空间,可自行分配,并在使用完后手动释放内存空间。

数据段:存放全局变量和static修饰的变量。整个工程可见,全局变量在main函数调用之前就已开辟栈空间

 

问题分析:

//实质是值传递
#include <stdio.h> #include <stdlib.h> #include <string.h> void getmemory(char *p) {
  //相当于有 p = (int *)0x7fff2c84ed90;即p指向这块(0x7fff2c84ed90)地址 printf(
"p0=%p \n",p);//这里的p指向数组的地址 p = (char *)malloc(100);//然后这里又让p重新指向新分配的一块地址 printf("p1=%p \n",p);//所以p0和p1的地址不一样
  strcpy(p, "hello wo!");//内容不会复制到数组中 }
int main() { char arr[100] = "abc"; printf("arr=%p \n",arr); char *ptr = arr; printf("ptr=%p \n",ptr); getmemory(ptr);//函数结束后都没有操作到arr的地址, /* Write C code in this online editor and run it. */ printf("ptr=%s \n",ptr); return 0; }

结果:
arr=0x7fff2c84ed90
ptr=0x7fff2c84ed90
p0=0x7fff2c84ed90
p1=0x121c270
ptr=abc

 

//实质是址传递
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
     
void getmemory(char **p)
{
    printf("p0=%p \n",*p);
    *p = (char *)malloc(100);
    printf("p1=%p \n",*p);
    
}
int main()
{
    char *arr = NULL;//char arr[100] = "abc";不能给数组赋值
    getmemory(&arr);
    printf("arr=%p \n",arr);
    strcpy(arr, "hello wo!");    
    printf("arr=%s \n",arr);
   
   return 0;
}

结果:
p0=(nil) 
p1=0x16cb270 
arr=0x16cb270 
arr=hello wo! 

画图分析:
二级指针变量p存放的是arr的地址,所以*p = arr

 

posted @ 2023-02-10 15:46  踏浪而来的人  阅读(16)  评论(0编辑  收藏  举报