簡體   English   中英

首先將字符串指針分配給已分配的內存,然后直接分配給字符串文字,這有什么區別?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM