c - 在 GCC 中禁用字符串的 NUL 终止

标签 c gcc null-terminated

是否可以在 GCC 中全局禁用以 NUL 结尾的字符串?

我正在使用我自己的字符串库,我完全不需要最后的 NUL 字符,因为它已经在结构内部存储了正确的长度。

但是,如果我想附加 10 个字符串,这将意味着在堆栈上分配了 10 个不必要的字节。对于宽字符串,情况更糟:对于 x86,浪费了 40 个字节;对于 x86_64,80 字节!

我定义了一个宏来将那些堆栈分配的字符串添加到我的结构中:

#define AppendString(ppDest, pSource) \
  AppendSubString(ppDest, (*ppDest)->len + 1, pSource, 0, sizeof(pSource) - 1)

使用 sizeof(...) - 1 效果很好,但我想知道我是否可以摆脱 NUL 终止以节省几个字节?

最佳答案

这很糟糕,但您可以显式指定每个字符数组常量的长度:

char my_constant[6] = "foobar";
assert(sizeof my_constant == 6);

wchar_t wide_constant[6] = L"foobar";
assert(sizeof wide_constant == 6*sizeof(wchar_t));

关于c - 在 GCC 中禁用字符串的 NUL 终止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1772078/

相关文章:

c++ - 为什么调试器总是在这个程序中跳过一行?

c++ - 使用字符串文字初始化时,std::strings 是否以 '\0' 结尾?

c - 使用 32 位 block 对 1024 位 2 的补码进行有符号乘法

c - 如何使用 fscanf 解析二进制文件

c - 我如何修改我的函数以仅创建一个新线程而不是两个,并且仍然获得相同的排序结果?

c - C字符串在内存中的表示和比较

复制内部包含空值的字符串

c - 阶乘尾随零,错误?

c - 为什么编译器警告并忽略对我的函数 strlen 的调用?

c - 在要求用户输入之前,scanf 接受输入的性质不明确?