Tag: cast

可以抛弃constness导致未定义的行为?

const int a = 10 int *p = (int*) &a; *p = 20; printf(“a = %d”, a); 是否可以输出10或20,具体取决于编译器?

是否由于未定义的行为造成错位负载?

是否由于void*未定义的行为导致错位负载? 以下是我对Clang及其消毒剂的看法: bufhelp.h:146:29: runtime error: load of misaligned address 0x7fff04fdd0e1 for type ‘const uintptr_t’ (aka ‘const unsigned long’), which requires 8 byte alignment 0x7fff04fdd0e1: note: pointer points here 00 00 00 66 66 6f 6f 62 61 72 34 32 46 4f 4f 42 41 52 31 37 66 6f 6f 62 61 72 34 […]

当我不转换malloc的结果时,为什么编译器会抱怨?

我正在检查不需要显式地转换malloc调用结果的代码,但每当我尝试这样做时,编译器都会抛出错误。 即 char *somevar; somevar = malloc(sizeof(char) * n); //error somevar = (char *)malloc(sizeof(char) * n); // ok

C样式转换可以处理的转换,但C ++转换不能

据说 C风格的演员只是尝试应用不同的C ++演员组合,并使用第一个允许的组合。 但是,我有一种感觉,我听说有些情况只有C风格的强制转换可以处理,而C ++强制转换的组合都不允许。 我错了吗? 在任何上下文(在C ++中)中的任何 C风格的强制转换都可以用适当的C ++强制转换组合替换,这是真的吗? UPD感谢干杯和他。 – Alf ,我们有一个C ++强制转换无法处理的例子,它们无法产生定义和预期的行为。 高级问题是提供一个C ++强制转换无法处理意义甚至无法编译的示例?

signed和unsigned int之间的强制转换是否在内存中保持变量的精确位模式?

我想通过套接字传递一个32位有符号整数x 。 为了让接收器知道期望哪个字节顺序,我在发送之前调用htonl(x) 。 虽然htonl需要一个uint32_t但我想确定当我将int32_t转换为uint32_t时会发生什么。 int32_t x = something; uint32_t u = (uint32_t) x; 总是这样的情况, x和u中的字节将完全相同吗? 怎么回事: uint32_t u = something; int32_t x = (int32_t) u; 我意识到负值会转换为大的无符号值,但这并不重要,因为我只是回到了另一端。 但是如果使用实际字节进行混乱,那么我无法确定返回将返回相同的值。

如何将简单指针转换为固定大小的多维数组?

我有一个函数,它采用指向浮点数组的指针。 基于其他条件,我知道指针实际上指向2×2 OR 3×3矩阵。 (实际上内存最初是这样分配的,例如float M [2] [2])重要的是我想在函数体中做出这个决定,而不是作为函数参数。 void calcMatrix( int face, float * matrixReturnAsArray ) { // Here, I would much rather work in natural matrix notation if( is2x2 ) { // ### cast matrixReturnAsArray to somethingAsMatrix[2][2] somethingAsMatrix[0][1] = 2.002; // etc.. } else if(is3x3) { //etc… } } 我知道我可以使用模板和其他技术来更好地解决这个问题。 我的问题是关于如何在###评论中进行这样的演员表。 使用C ++。

结构指针兼容性

假设我们有两个结构: typedef struct Struct1 { short a_short; int id; } Struct1; typedef struct Struct2 { short a_short; int id; short another_short; } Struct2; 从Struct2 *为Struct1 *是否安全? ANSI规范对此有何看法? 我知道有些编译器可以选择重新排序结构字段以优化内存使用,这可能会使两个结构不兼容。 有没有办法确定这段代码是否有效,无论编译器标志如何? 谢谢!

类型化malloc C ++

我有一些带有malloc语句的C代码,我想与一些C ++代码合并。 我想知道什么时候以及为什么要在C ++中调用malloc neccessary? 例如: char *str = (char*)malloc(strlen(argv[1]) * sizeof(char));

如何在我的C ++源代码中查找(并替换)所有旧的C风格数据类型转换?

如何在我的源代码中找到所有旧的C风格演员? 我正在使用Visual Studio,可能有一些编译器警告,我必须启用?

在C / C ++中进行数学运算时,我应该对哪些变量进行类型转换?

例如,当我划分两个整数并希望返回一个浮点数时,我迷信地写了这样的东西: int a = 2, b = 3; float c = (float)a / (float)b; 如果我不将a和b为浮点数,它将执行整数除法并返回一个int。 类似地,如果我想将带符号的8位数与无符号8位数相乘,我会在乘法之前将它们转换为有符号的16位数,以免出现溢出: u8 a = 255; s8 b = -127; s16 = (s16)a * (s16)b; 在完全不进行转换或仅转换其中一个变量时,编译器在这些情况下的行为究竟如何? 我是否真的需要显式地转换所有变量,或者只是左边的那个变量,还是右边的变量?