我在C中实现CMap
,其中一部分需要将信息存储在我手动管理内存的链表结构类型中。所以这个struct
的前4个字节是指向下一个struct
的指针,下一个部分是字符串(键),最后一个部分是值。
Say void *e = ptr
定义了一个这样的链表。
然后,ptr + 4
引用字符串部分的开头。
我想将该字符串值分配给另一个字符串,到目前为止我所做的是:
char *string = (char *)ptr + 4;
但是,我不认为这是对的。
答案 0 :(得分:0)
如果你想指向同一个字符串你的代码没问题,假设指针总是4字节宽。
如果要复制字符串的内容,请使用malloc和strcpy创建新字符串。
答案 1 :(得分:0)
只需引用struct而不是计算偏移量。
//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;
答案 2 :(得分:0)
@ralu是对的,你应该使用结构。但是在复制字符串时你也应该非常小心。在C中,没有像C ++,Java,Python那样的第一类字符串对象,以及其他所有东西。 :)
在C中,字符指针(char*
)通常用作字符串,但它们实际上只是指向内存中某些字节的空终止字节的指针。复制字符指针与复制基础字符数组不同。为此,您需要为副本的字符提供内存。此内存可以位于堆栈(本地数组)或堆(使用malloc创建)或其他缓冲区中。
在执行任何操作之前,您需要测量字符串的长度,以确保目标缓冲区可以容纳它。请务必在长度上添加一个,以便终止空值。
另请注意,标准库函数(strlen,strcpy,strncpy,strcat,snprintf,strdup等)在终止null方面略有不兼容。例如,strlen返回字符数,不包括终止空值,因此缓冲区需要比它返回的内容大一个字节。此外,strncpy不保证snprintf的空终止。一般来说,滥用这些功能和C字符串是导致计算机系统中出现大量安全漏洞(更不用说错误)的原因。
除非您构建或使用实体库,否则C中的字符串和列表操作是单调且容易出错的。你可以看到为什么发明了C ++和所有其他语言。