日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

关于malloc与字符指针的一些易错点

發布時間:2023/12/20 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 关于malloc与字符指针的一些易错点 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

?有如下一段代碼,意圖把“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 i=0;
? 8 ? ? ? ? p="zhongxiaoming";
? 9 ? ? ? ? for(;i<15;i++)
?10 ? ? ? ? { ? ? ??
?11 ? ? ? ? ? ? ? ? printf("p[%d]:%c\t",i,*(p+i));
?12 ? ? ? ? }
?13 ? ? ? ? printf("\n");
?14 ? ? ? ? free(p);
?15 ? ? ? ? p=NULL;
?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 ? ? ? ? p="zhongxiaoming"; 這行語句打亂了所有的計劃,導致分配出來的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 a=12;doule b=123.123123;

這里的12和123.123123都是放在靜態區的,他們都有個地址,這些常量與a、b對應,讀a也就是讀a對應的12.可是如果再有對a 的重新賦值,則常量區的12將會在某個時刻被系統回收掉,可以肯定的是,程序結束后肯定被釋放掉了,呵呵。。。重新賦值a,如a=12312,則又在靜態區創建12312與a對應,以此類推。),在此特別引申一點:

指針對應的字符串的訪問還可以通過poiner[i]操作符進行訪問。當然,在這里是想把“zhongxiaoming”全部讀出來。而p又指向其對應的地址(其實,用&(“zhongxiaoming”)可得到其地址),故我們可以通過p[i]進行訪問,當然了,不能寫哦,常量嘛,靜態區嘛。。。那我們就這樣完成了對常量區字符串“zhongxiaoming”的讀操作啦。當然,這是沒有修改過的源代碼的功能。

free===================================================

按照沒有修改過的源代碼,直接就free(p),也太夸張了吧,把p(也就是&(“zhongxiaoming”)對應的內存釋放),這是要逆天了?想去釋放靜態區的內存。。嘿嘿,這可是系統自己的事,最好還是別干預了。所以,系統報錯。。。說,malloctest(2617) malloc: *** error for object 0x107b27f48: pointer being freed was not allocated。也就是說,這不是你分配的內存,這段內存不歸你管。。。

修改代碼==================================================

而加入strcpy的新代碼,要對p對應的內容進行訪問也就是有【】操作符或者*(p+i)了,千萬別寫成&p+i哦,這樣子可是會挎了15個字節訪問了哦。。。我們把代碼修改下:

#include <stdio.h>
? 2 #include <stdlib.h>
? 3 #include <string.h>
? 4 int main()
? 5 {
? 6 ? ? ? ? char *p = (char*)malloc(15);
? 7 ? ? ? ? int i=0;
? 8 ? ? ? ? memset(p,'A',15);
? 9 ? ? ? ? for(;i<15;i++)
?10 ? ? ? ? { ? ? ? ? ? ? ?
?11 ? ? ? ? ? ? ? ? ?printf("p[%d]:%c\t",i,p[i]);
?12 ? ? ? ? }
?13 ? ? ? ? printf("\n\n");
?14 ? ? ? ??
?15 ? ? ? ? strcpy(p,"zhongxiaoming");
?16 ? ? ? ? for(i=0;i<15;i++)
?17 ? ? ? ? { ? ? ??
?18 ? ? ? ? ? ? ? ? printf("p[%d]:%c\t",i,p[i]);
?19 ? ? ? ? }
?20 ? ? ? ? printf("\n");
?21 ? ? ? ? free(p);
?22 ? ? ? ? p=NULL;
?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

總結

以上是生活随笔為你收集整理的关于malloc与字符指针的一些易错点的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。