Tag: 未定义的行为

C中的此代码是否属于未定义行为类别?

a是一个数组, foo是一个函数, i是一个int 。 a[++i] = foo(a[i-1], a[i]); 上面的代码会有未定义的行为吗? 数组索引++i , i-1和i保证在数组范围内。

在C中,如果我对一个指针进行转换和取消引用,那么我先做哪一个是否重要?

在C中,您可以将int , float和指针等简单数据类型转换为这些数据类型。 现在我假设如果你想从一个类型的指针转​​换为另一个类型的值(例如从*float到int ),则转换和解除引用的顺序无关紧要。 也就是说,对于变量float* pf ,你有(int) *pf == *((int*) pf) 。 有点像数学中的交换性…… 然而,情况似乎并非如此。 我写了一个测试程序: #include int main(int argc, char *argv[]){ float f = 3.3; float* pf = &f; int i1 = (int) (*pf); int i2 = *((int*) pf); printf(“1: %d, 2: %d\n”, i1, i2); return 0; } 在我的系统上输出是 1: 3, 2: 1079194419 因此,转换指针似乎与转换值的方式不同。 […]

C:何时在指针类型之间进行转换而不是未定义的行为?

作为C的新手,我很困惑何时投射指针实际上是可以的。 据我所知,你几乎可以将任何指针类型转换为任何其他类型,编译器将允许你这样做。 例如: int a = 5; int* intPtr = &a; char* charPtr = (char*) intPtr; 但是,通常这会调用未定义的行为(尽管它恰好在许多平台上工作)。 这说,似乎有一些例外: 你可以自由地void* (?) 你可以自由地转换为char* (?) (至少我在代码中看过它…)。 那么指针类型之间的转换在C中是不是未定义的行为? 编辑: 我试着查看C标准(“6.3.2.3指针”一节,见http://c0x.coding-guidelines.com/6.3.2.3.html ),但除了有点void*之外,我并没有真正理解它void* 。 EDIT2: 只是为了澄清:我明确地只询问“正常”指针,即不是关于函数指针。 我意识到,转换函数指针的规则是非常严格的。 事实上,我已经问过:-): 如果我转换函数指针,改变参数的数量会发生什么