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
标签:arr,ptr,char,地址,动态内存,printf,0x7fff2c84ed90,开辟 From: https://www.cnblogs.com/zj-studyrecoding/p/17109188.html