翻译网站平台建设,微商客源人脉app下载,网站策划书哪个容易做,线下推广活动有哪些有如下一段代码#xff0c;意图把“zhongxiaoming字符串赋值进以p为首地址的空间为15字节的内存空间#xff0c;然后释放p所指向的内存#xff0c;以免出现内存泄露。 该代码出现几个问题#xff0c;涉及到内存的赋值、malloc函数以及free函数的用法#xff0c;以及… 有如下一段代码意图把“zhongxiaoming字符串赋值进以p为首地址的空间为15字节的内存空间然后释放p所指向的内存以免出现内存泄露。 该代码出现几个问题涉及到内存的赋值、malloc函数以及free函数的用法以及字符串的相关知识。 1 #include stdio.h 2 #include stdlib.h 3 4 int main() 5 { 6 char *p (char*)malloc(15); 7 int i0; 8 pzhongxiaoming; 9 for(;i15;i) 10 { 11 printf(p[%d]:%c\t,i,*(pi)); 12 } 13 printf(\n); 14 free(p); 15 pNULL; 16 printf(ok\n); 17 return 0; 18 } 编译运行后 Love-Yan:pointertest MD101$ make gcc -o malloctest malloctest.c -g Love-Yan:pointertest MD101$ ./malloctest p[0]:z p[1]:h p[2]:o p[3]:n p[4]:g p[5]:x p[6]:i p[7]:a p[8]:o p[9]:m p[10]:i p[11]:np[12]:g p[13]:p[14]:p malloctest(3232) malloc: *** error for object 0x107a45f4e: pointer being freed was not allocated *** set a breakpoint in malloc_error_break to debug Abort trap: 6 可知道pointer being freed was not allocated。意思是意图释放的指针p没有被分配这是什么意思呢明明malloc了15字节的空间怎么说没有被分配呢 原来 malloc 8 pzhongxiaoming; 这行语句打乱了所有的计划导致分配出来的15字节空间丢失了内存泄露掉了。 6 char *p (char*)malloc(15);这时候的p才是15字节的真正主人。 按照本意我们采用strcpy就可以把“zhongxiaoming”拷贝进p指向的内存。不过要记得加进string.h头文件哦。具体代码 strcpy(p,zhongxiaoming);这样p对应的连续15个内存地址就依次被赋值了当然只是赋值了strlen“zhongxiaoming”1个字节后面的应该保持不变因为malloc分配出来的空间不会对内存进行初始化而new操作符分配出来的会初始化。 字符串、内存静态区 第八行代码把在静态区创建的字符串常量“zhongxiaoming”的首地址赋值给了p此时指针变量p的值发生了变化不再是指向15个字节的首地址了。 此时可以通过p对字符串常量进行读的操作无写操作字符常量不允许修改通常在静态区的内容很多都是字符常量、整形常量等等譬如int a12doule b123.123123; 这里的12和123.123123都是放在静态区的他们都有个地址这些常量与a、b对应读a也就是读a对应的12.可是如果再有对a 的重新赋值则常量区的12将会在某个时刻被系统回收掉可以肯定的是程序结束后肯定被释放掉了呵呵。。。重新赋值a如a12312则又在静态区创建12312与a对应以此类推。在此特别引申一点 指针对应的字符串的访问还可以通过poiner[i]操作符进行访问。当然在这里是想把“zhongxiaoming”全部读出来。而p又指向其对应的地址其实用“zhongxiaoming”可得到其地址故我们可以通过p[i]进行访问当然了不能写哦常量嘛静态区嘛。。。那我们就这样完成了对常量区字符串“zhongxiaoming”的读操作啦。当然这是没有修改过的源代码的功能。 free 按照没有修改过的源代码直接就freep也太夸张了吧把p也就是“zhongxiaoming”对应的内存释放这是要逆天了想去释放静态区的内存。。嘿嘿这可是系统自己的事最好还是别干预了。所以系统报错。。。说malloctest(2617) malloc: *** error for object 0x107b27f48: pointer being freed was not allocated。也就是说这不是你分配的内存这段内存不归你管。。。 修改代码 而加入strcpy的新代码要对p对应的内容进行访问也就是有【】操作符或者*(pi)了千万别写成pi哦这样子可是会挎了15个字节访问了哦。。。我们把代码修改下 #include stdio.h 2 #include stdlib.h 3 #include string.h 4 int main() 5 { 6 char *p (char*)malloc(15); 7 int i0; 8 memset(p,A,15); 9 for(;i15;i) 10 { 11 printf(p[%d]:%c\t,i,p[i]); 12 } 13 printf(\n\n); 14 15 strcpy(p,zhongxiaoming); 16 for(i0;i15;i) 17 { 18 printf(p[%d]:%c\t,i,p[i]); 19 } 20 printf(\n); 21 free(p); 22 pNULL; 23 return 0; 24 } 运行 Love-Yan:pointertest MD101$ make gcc -o malloctest malloctest.c -g Love-Yan:pointertest MD101$ ./malloctest p[0]:z p[1]:h p[2]:o p[3]:n p[4]:g p[5]:x p[6]:i p[7]:a p[8]:o p[9]:m p[10]:i p[11]:n p[12]:g p[13]: p[14]: Love-Yan:pointertest MD101$ 大功告成。。。 不过在这里如果要考究下strcpy对p的15个字节处理了多少个呢我们可以先用memset来对这15个字节进行下初始化然后再输出看看就知道了。 Love-Yan:pointertest MD101$ make gcc -o malloctest malloctest.c -g Love-Yan:pointertest MD101$ ./malloctest p[0]:A p[1]:A p[2]:A p[3]:A p[4]:A p[5]:A p[6]:A p[7]:A p[8]:A p[9]:A p[10]:A p[11]:Ap[12]:A p[13]:Ap[14]:A p[0]:z p[1]:h p[2]:o p[3]:n p[4]:g p[5]:x p[6]:i p[7]:a p[8]:o p[9]:m p[10]:i p[11]:np[12]:g p[13]:p[14]:A Love-Yan:pointertest MD101$ good news。。。只是对前面的部分字节进行了赋值。可是第十四了也就是p[13]里边的内容是空的。。这是怎么回事 我们知道字符串的结尾是\0‘对吧里边会不会就是\0呢我们可以gdb一下。看看这个p[13]是什么。 果然。。。 (gdb) p p[13] $2 0 \0 (gdb) 转载于:https://www.cnblogs.com/iosDevZhong/p/4395242.html