[英]How to assign string value in C from void *?
我正在用C實現一個CMap
,其中一部分需要將信息存儲在我手動管理其內存的鏈表類型的結構中。 因此,此struct
的前4個字節是指向下一個struct
的指針,下一個部分是字符串(鍵),最后一個部分是值。
說void *e = ptr
定義了一個這樣的鏈表。 然后, ptr + 4
指向字符串部分的開頭。 我想將該字符串值分配給另一個字符串,到目前為止,我所做的是:
char *string = (char *)ptr + 4;
但是,我認為這是不對的。
如果要指向相同的字符串,則代碼很好,假設指針始終為4個字節寬。
如果要復制字符串的內容,請使用malloc和strcpy創建新的字符串。
只是引用結構而不是計算偏移量。
//if data is structured this way
struct struct_list_el
{
struct list_el * next;
char* str;
int value;
};
typedef struct struct_list_el list_el;
// than from void_pointer
list_el* el;
el = (list_el*) void_pointer;
char * string;
string = el->str;
@ralu對,您應該使用結構。 但是在復制字符串時也應該非常小心。 在C語言中,沒有像C ++,Java,Python這樣的一流字符串對象,以及其他所有東西。 :)
在C語言中,字符指針( char*
)通常用作字符串,但實際上它們實際上只是指向內存中某個位置的空終止字節數組的指針。 復制字符指針與復制底層字符數組不同。 為此,您需要為副本的字符提供存儲空間。 該內存可以在堆棧(本地數組),堆(使用malloc創建)或其他緩沖區上。
在執行任何操作以確保目標緩沖區可以容納它之前,您需要測量字符串的長度。 請確保在長度上加一,以便有足夠的空間容納終止空值。
另請注意,關於終止null,標准庫函數(strlen,strcpy,strncpy,strcat,snprintf,strdup等)彼此之間有些不兼容。 例如,strlen返回的字符數(不包括結尾的null),因此緩沖區需要比返回的內容大一個字節。 另外,strncpy不能保證null終止,而snprintf可以。 通常,這些功能和C字符串的濫用是造成當今計算機系統中大量安全漏洞(更不用說bug)的原因。
除非您構建或使用可靠的庫,否則C語言中的字符串和列表操作將是乏味且容易出錯的。 您可以看到為什么發明了C ++和所有其他語言。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.