[英]What is the difference between assigning a string pointer first to allocated memory and directly to a string literal?
所以我的理解是,這兩個代碼塊是有效的,並且執行相同的操作。
1.)
char *ptr = malloc(5);
ptr = "hi";
2.)
char *ptr = "hi";
我想知道兩者之間的區別,例如兩者是否有優勢。
前者是一個錯誤,因此不應編寫該代碼。
它用字符串文字的地址覆蓋malloc()
返回的指針,從而丟棄原始指針並泄漏內存。
您必須使用strcpy()
或其他某種內存復制方法來使用字符串初始化新分配的堆內存。
第二個只是將字符串文字的(運行時常量)地址分配給指針ptr
,沒有字符被復制到任何地方。
第一位是可能的內存泄漏,第二位取決於所使用的隱式const
存儲類,並將不可變字符串的內存地址分配給指針。
基本上:
char *ptr = malloc(5);//allocates 5 * sizeof *ptr
//then assigns the address where this block starts to ptr
//this:
ptr = "hi";//assigns position of 'h','i', '\0' in read-only mem to ptr
現在, ptr
指向的您分配的地址仍然被分配。 區別在於您不再需要任何“句柄” ,因為ptr
的值已更改。 沒有指針指向使用malloc
分配的動態內存,因此管理內存變得非常棘手...您可能無法free
它,而現在在ptr
上調用free
將導致未定義的行為。
如果您寫:
char *ptr = "hi";
然后,您實際上在寫:
const char *ptr = "hi";
這意味着您不能將ptr
指向的字符串更改為:
ptr[0] = 'H';//IMBOSSIBRU
替代方法是:
char string[] = "Hi";//copies Hi\0 to string
//or
char *ptr = malloc(5);
strcpy(ptr, "hi");//requires string.h
上面兩個代碼段的區別在於,第一個代碼段創建了一個堆棧數組,第二個代碼段在堆上分配了一塊內存。 堆棧內存幾乎在所有方面都更易於管理,更快,更好,除了它的內存不足之外,而且實際上不能用作返回值...
每個進程都有一個字符串文字池。 每當您在代碼中創建字符串文字時,該文字就會保存在池中,並返回字符串的地址(即指向池某處的地址)。 因此,您的第一個選擇是創建內存泄漏,因為您要覆蓋通過malloc收到的地址。
在第一種情況下
char *ptr = malloc(5);
ptr = "hi";
存在內存泄漏,稍后您將ptr指向字符串常量“ hi”,該字符串確實需要堆中的所有內存(這就是內存泄漏的原因)。
但是,如果您正在分配內存,並且您正在使用
strcpy (ptr, "hi");
然后,如果您希望可以對其進行修改
strcpy (ptr, "hello")
一種情況是您之前分配了足夠的內存。
但是在您的情況下,您要為指針ptr分配一個字符串文字,在這里您將無法對其進行修改
ptr = "hello" // not valid. This will give a segmentation fault error
在第二種情況下,沒有內存泄漏,並且您正在創建指向字符串文字的指針,因此無法修改其值,因為它將存儲在只讀數據段中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.