[英]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
在任何系統上很容易在int
或unsigned
的大小范圍內,並且與為其分配存儲無關(除非您使用的是 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 pointer
的type 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.