簡體   English   中英

如何在C中使用malloc正確分配內存

[英]How to properly allocate memory using malloc in C

我有一個空指針,我需要正確分配正確類型的內存。 說:

char * array="20080101"

現在,我知道這個字符字符串包含的值是一個長類型。 現在,我有一個空指針:

void* pointer;

我需要為它分配正確數量的內存並將其轉換為長指針,以便它指向一個長值(20080101);

問題是我們如何做到這一點? 根據我的研究,我知道我可以使用 malloc 分配它:

void *pointer=(long*) malloc(sizeof(long) OR sizeof(long)*strlen(array));// what should be the correct parameter.

我們如何使它指向 long 類型的值? 我們有我們的字符串數組。

哦,你有點糊塗了。 首先,指針是指針,是指針,而不是長指針和短指針(不再),它們的大小都相同(通常在x86_64上為8-bytes ,在x86上為4-bytes )。

您的array指向一個以空字符結尾的字符串文字,其中包含 2008 年 1 月 1 日的明顯編碼日期。數值20080101在任何系統上很容易在intunsigned的大小范圍內,並且與為其分配存儲無關(除非您使用的是 16 位系統)。

如果要將string轉換為long ,可以使用strtol ,例如:

long myval = strtol (array, NULL, 10);

為基數10轉換。 第二個參數(在NULL之上)實際上是一個endptr ,它在成功轉換時返回指向array轉換后的數字后的下一個字符的指針(如果字符串包含其他字符)。 您需要包含<stdlib.h>才能使用strtol

至於你的演員問題,如果你有array並且它作為void傳遞,例如

long *somefunction (void *value, long *myval, ...)

在某些函數中,您需要為轉換做兩件事:

*myval = strtol (value, NULL, 10);

return myval;

或者,如果您只需要從myval創建一個指向 long 的指針,只需創建指針:

long *lpointer = &myval;

為陣列分配存儲

當您為任何字符串動態分配存儲空間時,您需要字符串的長度( + 1表示空終止符)。 在這里,您需要了解sizeof將返回什么以及strlen將返回什么。 如果你使用sizeof anypointer ,你不會得到長度,你會得到指針大小( 8-bytes等)。 當您使用sizeof dereferenced pointer您將獲得sizeof dereferenced pointertype size (例如sizeof *somelongpointer將為您提供系統上long的存儲大小)

如果您要復制字符串,最好包含<string.h>然后:

size_t len = strlen (array);

然后你就可以分配存儲了:

char *mycopy = malloc (len * sizeof *array + 1);
strncpy (mycopy, array, len * sizeof *array + 1);

mycopy然后保存array的內容。 由於它是動態分配的,因此您應該在不再需要它時free (mycopy);它(例如free (mycopy);

如果您的目的是創建一個指向long類型和動態的分配存儲long ,那么你就需要sizeof以確定您的系統上的長尺寸。 例如

long *mylong = malloc (sizeof *mylong);

然后,(使用相同的somefunction示例):

*mylong = strtol ((char *)value, NULL, 10);

return mylong;

抱歉造成混亂,但這應該涵蓋所有情況:)

如果你真的想分配足夠的內存來保存一個長整數,你可以這樣做

long* value = malloc(sizeof(*value));

然后像@David 所說的那樣分配給它:

*value = strtol(array, NULL, 10);

然而,使用局部變量來保存整數通常更簡單,而不是從堆中分配它們。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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