在C中,从字符串开头删除字符的成本较低的方法是什么?

在C中,从字符串开头删除字符的成本较低的方法是什么?,c,string,dynamic-memory-allocation,strdup,C,String,Dynamic Memory Allocation,Strdup,我必须创建一个非常便宜的算法(处理器和内存)来从C中的字符串(字符数组)中删除第一个char 我目前正在使用: char *newvalue = strdup(value+1); free(value); value = newvalue; 但我想知道是否有更便宜的方法可以做到这一点。字符串值是动态分配的。值+1是一个字符*,表示删除了第一个字符的字符串。这是获得这种字符串的较便宜的方法 释放内存时必须小心,确保释放原始指针,而不是移位的指针。重用原始数组。速度可能更快,也可能更快,这取决于内

我必须创建一个非常便宜的算法(处理器和内存)来从C中的字符串(字符数组)中删除第一个
char

我目前正在使用:

char *newvalue = strdup(value+1);
free(value);
value = newvalue;

但我想知道是否有更便宜的方法可以做到这一点。字符串
是动态分配的。

值+1
是一个
字符*
,表示删除了第一个字符的字符串。这是获得这种字符串的较便宜的方法


释放内存时必须小心,确保释放原始指针,而不是移位的指针。

重用原始数组。速度可能更快,也可能更快,这取决于内存分配和复制的相对速度

int size = strlen(value);
if (size > 0) memmove(value, value+1, size);

由于堆调用将非常昂贵,显而易见的优化是避免它们

如果您需要经常这样做,您可能会在裸指针周围找到一些简单的包装器来表达这一点

比如:

typedef struct {
  const char *chars;
  size_t offset;
} mystring;
然后,您需要设计一个API,通过添加偏移量将
mystring*
转换为字符指针:

const char * mystring_get(const mystring *ms)
{
  return ms->chars + ms->offset;
}
当然,还有一个函数,用于创建删除第一个字符的后缀:

mystring mystring_tail(const mystring *ms)
{
  const mystring suffix = { ms->chars, ms->offset + 1};

  return suffix;
}

请注意,
mystring_tail()
按值返回新的字符串结构,以避免堆分配。

仅当两个字符串都是不可变的时。@BlagovestBuyukliev:问题显示原始字符串已被释放,因此不再需要它。因此,
value+1处的字符串不必是不可变的;可以根据需要对其进行修改,而这对原始字符串的影响是不相关的,因为原始字符串将不再使用。@Olotiar:在这种情况下,我需要在值+1,值[0]之前释放字符。我不知道在这种情况下,内存是否在系统中保持映射状态为“已使用”,但没有指向它的指针,或者,操作系统是否为我清理了这个内存空间。由于我不能使用free,因为它将清理整个空间,而不仅仅是位置0。注意:如果
为“”,则此代码具有UB。这也是一个非常好的主意。不过,我建议您使用
const size\u t size
。)