繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM