如何从void *中分配C中的字符串值?

时间:2011-10-25 22:28:23

标签: c string struct void-pointers

我在C中实现CMap,其中一部分需要将信息存储在我手动管理内存的链表结构类型中。所以这个struct的前4个字节是指向下一个struct的指针,下一个部分是字符串(键),最后一个部分是值。

Say void *e = ptr定义了一个这样的链表。 然后,ptr + 4引用字符串部分的开头。 我想将该字符串值分配给另一个字符串,到目前为止我所做的是:

char *string = (char *)ptr + 4;

但是,我不认为这是对的。

3 个答案:

答案 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 ++和所有其他语言。