草庐IT

months3char

全部标签

c++ - char* 和 std::uint8_t* 之间的 reinterpret_cast - 安全吗?

现在我们有时都必须使用二进制数据。在C++中,我们使用字节序列,并且从一开始char是我们的基石。定义为sizeof1,它是字节。并且所有库I/O函数都使用char默认。一切都很好,但总有一点问题,一些奇怪的问题困扰了一些人-一个字节中的位数是实现定义的。所以在C99中,决定引入几个typedef来让开发人员轻松表达自己,固定宽度的整数类型。当然是可选的,因为我们不想损害可移植性。其中,uint8_t,作为std::uint8_t迁移到C++11,一个固定宽度的8位无符号整数类型,对于真正想要使用8位字节的人来说是完美的选择。因此,开发人员接受了新工具并开始构建明确声明他们接受8位字节

c++ - 不推荐从字符串文字到 'char*' 的转换

我有一个程序,它声明一个字符串数组,如下所示:char*colors[4]={"red","orange","yellow","blue"};但我收到了上述编译器警告。它可以编译,但我宁愿使用不推荐的方式(如果有的话)。我试图找出它的含义,但我似乎无法弄清楚。我听说在'char'起作用之前使用'const',但如果有人能解释错误的含义会很有帮助。谢谢。 最佳答案 您输入的字符串:“red”、“organge”等是“literal”,因为它们是在程序代码本身内部定义的(它们不是直接从磁盘、用户输入/stdin等读取的)。这意味着,如果

c++ - 我可以将 unsigned char 转换为 char ,反之亦然吗?

我想使用一个需要这样数据的函数:voidprocess(char*data_in,intdata_len);所以它实际上只是在处理一些字节。但是当涉及到原始字节时,我更喜欢使用“unsignedchar”(它以某种方式“感觉”只处理正的0到255值更合适),所以我的问题是:我是否可以始终安全地将unsignedchar*传递给此函数?换句话说:是否保证我可以随意在char和unsignedchar之间安全地转换(转换)而不丢失任何信息?我是否可以随意在指向char和unsignedchar的指针之间安全地转换(强制转换)而不丢失任何信息?奖励:C和C++中的答案是否相同?

c++ - 使用 malloc 时从 `void*' 到 `char*' 的无效转换?

我在下面的代码中遇到问题,第5行出现错误:error:invalidconversionfromvoid*tochar*我正在使用带有代码块的g++,并尝试将此文件编译为cpp文件。有关系吗?#includeintmain(){char*foo=malloc(1);if(!foo){printf("malloc()");exit(1);}OPENSSL_cleanse(foo,1);printf("cleanedonebyte\n");OPENSSL_cleanse(foo,0);printf("cleanedzerobytes\n");} 最佳答案

c++ - char 和 char[1] 的区别

在C++中,使用char和char[1]有什么区别(如果有的话)。例子:structSomeStruct{charx;chary[1];};对于unsignedchar是否有同样的原因? 最佳答案 主要区别只是您用于访问一个字符的语法。我所说的“访问”是指使用语言中的各种运算符对其进行操作,与char数组。这听起来好像x和y几乎完全不同。如果事实上它们都“由”一个字符组成,但该字符以非常不同的方式表示。实现可能会导致其他差异,例如它可能会根据您使用的结构以不同的方式对齐和填充结构。但我怀疑它会。运算符差异的一个例子是char是可赋值

c++ - new char 实际上是否保证了类类型的对齐内存?

通过newchar[sizeof(T)]分配一个缓冲区,保证为T类型分配正确对齐的内存,其中的所有成员T有它们自然的、实现定义的对齐方式(也就是说,您没有使用alignas关键字来修改它们的对齐方式)。我在这里的一些答案中看到了这个保证,但我并不完全清楚标准是如何达到这个保证的。标准的5.3.4-10给出了基本要求:本质上newchar[]必须与max_align_t对齐。我缺少的是表示alignof(T)将始终是最大值为max_align_t的有效对齐方式。我的意思是,这似乎很明显,但结构的对齐结果是否必须最多为max_align_t?甚至第3.11-3点说可能支持扩展对齐,所以编译

c++ - 如何将 std::string 复制到 std::vector<char> 中?

这个问题在这里已经有了答案:关闭10年前.PossibleDuplicate:Convertingstd::stringtostd::vector我试过了:std::stringstr="hello";std::vectordata;std::copy(str.c_str(),str.c_str()+str.length(),data);但它不起作用=(所以我想知道如何将std::string复制到std::vector或std::vector中? 最佳答案 std::vector有一个带有两个迭代器的构造函数。你可以使用它:std

c++ - int8_t 和 uint8_t 是 char 类型吗?

给定这个C++11程序,我应该期望看到一个数字还是一个字母?还是不抱期望?#include#includeintmain(){int8_ti=65;std::cout标准是否指定此类型是否可以或将是字符类型? 最佳答案 来自C++0xFDIS(N3290)的§18.4.1[cstdint.syn],int8_t是一个可选的typedef,指定如下:namespacestd{typedefsignedintegertypeint8_t;//optional//...}//namespacestd§3.9.1[basic.fundame

c++ - 内置类型的析构函数(int、char 等)

在C++中,以下代码给出编译器错误:voiddestruct1(int*item){item->~int();}这段代码几乎相同,我只是将int类型定义为另一种类型,神奇的事情发生了:typedefintmyint;voiddestruct2(myint*item){item->~myint();}为什么第二个代码有效?一个int是否仅仅因为它已被类型定义而得到一个析构函数?如果您想知道为什么有人愿意这样做:这来自重构C++代码。我们正在删除标准堆并用自制池替换它。这需要我们调用placement-new和析构函数。我知道为原始类型调用析构函数是没有用的,但我们仍然希望在代码中使用它们

c++ - 什么时候 uint8_t ≠ unsigned char?

根据C和C++,CHAR_BIT>=8。但是每当CHAR_BIT>8时,uint8_t甚至都不能表示为8位。它必须更大,因为CHAR_BIT是系统上任何数据类型的最小位数。在什么样的系统上,uint8_t可以合法地定义为unsignedchar以外的类型?(如果C和C++的答案不同,那么我想两者都知道。) 最佳答案 如果存在,uint8_t必须始终与unsignedchar具有相同的宽度。但是,它不必是同一类型;它可能是一个不同的扩展整数类型。它也不需要与unsignedchar具有相同的表示;例如,可以以相反的顺序解释这些位。这是