gcc的非空终止字符串编译器选项

Gla*_*ost 7 c c++ string gcc null-terminated

更新

原来这只是"c ++不是c布鲁斯"的另一个案例


我想要的是

const char hex[16] = "0123456789ABCDEF";
Run Code Online (Sandbox Code Playgroud)

唯一有效的

char hex[16] = "0123456789ABCDE"; hex[15] = "F";
Run Code Online (Sandbox Code Playgroud)

是否有任何编译器选项或我可以做的事情使gc​​c编译器中的字符串不为null终止.这样我就可以制作一个(n)常数数组

Sie*_*geX 11

不需要编译器选项,它已经非NUL终止.标准说只有在NUL适合的情况下才应添加NUL,否则它将是溢出.它可能只是你的数组中存储器中的下一个字节\0

§6.7.8p14

字符类型数组可以用字符串文字初始化,可选择用大括号括起来.字符串文字的连续字符(如果有空间或数组大小未知,则包括终止空字符)初始化数组的元素.

  • 应该注意的是,这在C++中与在C中的不同.C++要求使用字符串文字的char数组初始化程序必须附加'\ 0' - 好的(?)新闻是它将生成编译时如果您尝试将依赖于此行为的代码编译为C++,则会出现错误. (4认同)

wal*_*lyk 7

NUL终止的字符串是该语言固有的.您可以拥有一个字符数组,并逐个设置每个字符:

char hex [] = {'0', '1', '2', ... 'F'};
Run Code Online (Sandbox Code Playgroud)

  • 好答案.只是注意到OP似乎有兴趣声明一个正好16个字节的数组,所以在你的例子中包含数组大小说明符可能会有所帮助...`const char hex [16] = {'0',' 1','2',......'F'};` (2认同)

R..*_*R.. 5

你是在自问自答.如果明确给出数组长度,如:

const char hex[16] = "0123456789ABCDEF";
Run Code Online (Sandbox Code Playgroud)

那么它当然不会以空值终止,因为没有为空终止保留的存储空间.(hex[16]在对象的边界之外,因此读或写它是未定义的行为.如果它恰好读为0,那就是你的UB ...)

只有当你隐藏长度时才会这样,如:

const char hex[] = "0123456789ABCDEF";
Run Code Online (Sandbox Code Playgroud)

或者如果您使用字符串文字作为对象而不是初始化程序,它将具有空终止.

顺便说一下,如果您不打算使用它,为什么要关心是否存在空终止.您是否想要从二进制文件中删除字节?:-)