Tag: undefined behavior

在相同的表达式未定义行为中调用具有局部副作用的函数两次?

int f() { static int i=0; return ++i; } int g() { return f() + f(); } g()返回3还是undefined的结果?

快速排序示例中的错误(K&R C书)?

这个快速排序应该将“v [left] … v [right]排序为增加顺序”; K&R(第二版)从C编程语言中复制(不带注释): void qsort(int v[], int left, int right) { int i, last; void swap(int v[], int i, int j); if (left >= right) return; swap(v, left, (left + right) / 2); last = left; for (i = left+1; i <= right; i++) if (v[i] < v[left]) swap(v, ++last, i); swap(v, […]

总和+++我在C中的未定义行为?

我在不同的机器和不同的编译器上测试了这个,但是我给出了相同的输出: int sum = 10, i = 5; printf(“%d”, sum+++i); 这是C中明确定义或未定义的行为吗?

是否定义了在无法到达的路径上具有未定义行为的程序的行为?

考虑 void swap(int* a, int* b) { if (a != b){ *a = *a ^ *b; *b = *a ^ *b; *a = *a ^ *b; } } int main() { int a = 0; int b = 1; swap(&a, &b); // after this b is 0 and a is 1 return a > b […]

无效指针再次变为有效

int *p; { int x = 0; p = &x; } // p is no longer valid { int x = 0; if (&x == p) { *p = 2; // Is this valid? } } 在指向它的事物被释放后访问指针是未定义的行为,但是如果稍后的分配发生在同一区域会发生什么,并且您明确地将旧指针与指向新事物的指针进行比较? 如果我在比较它们之前将&x和p uintptr_t为uintptr_t会有什么关系吗? (我知道不能保证两个x变量占据相同的位置。我没有理由这样做,但我可以想象一个算法,你可以用一组明确的指针释放一组指针。有效的指针,删除进程中的无效指针。如果先前失效的指针等于已知的良好指针,我很好奇会发生什么。)

重新分配NULL值(或未定义)指针

我正在读关于realloc并且对那里提到的一点感到困惑。 考虑以下代码: #include #include int main () { int* ptr = NULL; ptr = realloc(ptr, 10*sizeof(int)); return 0; } 使用最初为NULL值的ptr分配带realloc内存是否有任何危险? 如果不是: int* ptr = NULL; 我有这个: int* ptr; // no value given to ptr 使用ptr调用realloc会有问题吗?

int a = 1,b = a ++; 调用未定义的行为?

int a=1, b=a++; 调用未定义的行为? 在a的初始化和b的初始化程序中a访问和修改之间没有序列点介入,但据我所知,初始化不是对象的“修改”; 指定初始值设定项以提供对象的“初始值”。 根据6.7.8初始化,第8段: 初始值设定项指定存储在对象中的初始值。 在对对象进行任何访问之前对“初始”进行排序似乎是合理的。 此问题是否已经考虑过,是否有可接受的解释?

给定堆栈和寄存器的状态,我们可以预测printf的未定义行为的结果

以下是类测验的一些简单C代码: #include int main() { float a = 2.3; printf(“%d\n”, a); return 0; } 编译并运行: Apple LLVM版本6.1.0( clang-602.0.53 )(基于LLVM 3.6.0svn) 目标: x86_64 -apple-darwin14.5.0 此代码的输出undefined 。 我试图通过检查调试器附近的内存(gdb中的X命令)来预测输出。 例如,当a的地址是0x7fff5fbffb98 , &a附近的上下文如下: 0x7fff5fbffb98: 1075000115 0x7fff5fbffb9c: 0 0x7fff5fbffba0: 1606417336 0x7fff5fbffba4: 32767 0x7fff5fbffba8: -1754266167 0x7fff5fbffbac: 32767 0x7fff5fbffbb0: -1754266167 0x7fff5fbffbb4: 32767 然后printf的输出是1606417352 。 我知道使用不正确的说明符时的输出是未定义的。 出于好奇,我预计这个未定义行为的输出与正在运行的堆栈或寄存器的某些内存有关,但我还没弄清楚如何关联它。 那么使用哪个地址或寄存器来设置这个printf的输出? 换句话说,给定运行堆栈的状态以及来自所有寄存器的所有值,我们可以预测(如果是这样)这种未定义行为的输出吗?

返回局部变量行为的地址

可能重复: 可以在其范围之外访问局部变量的内存吗? 输入: #include #include int func2(void); int* func1(void); int func2(void) { int* b; b = func1(); printf(“%d”, *b); printf(“%d”, *b); printf(“%d”, *b); } int* func1() { int a = 13; return &a; } int main() { func2(); } 输出: 13 -1077824828 -1077824828 有人可以解释堆栈和操作系统中发生的事情吗? 获取指针值后,为什么结果从13变为垃圾?

优先于*运算符

我的代码中的某个地方我做的非常糟糕。 我在我的extrema变量中运行时会出现未定义的行为,但大部分时间它甚至都没有运行。 任何帮助都会非常棒。 #include void get_extrema(int quadrant, int **extrema) { if (quadrant == 1) { *(extrema)[0] = 0; *(extrema)[1] = 90; } else if (quadrant == 2) { *(extrema)[0] = -90; *(extrema)[1] = 0; } } void print(int* arr) { printf(“%i”,arr[0]); printf(“,”); printf(“%i\n”,arr[1]); } int main(void) { int *extrema = (int*)malloc(2*sizeof(int)); get_extrema(1,&extrema); print(extrema); get_extrema(2,&extrema); print(extrema); […]