Tag: 未定义行为

数组和指向字符串文字的指针之间的区别

我是C的新手,所以这可能是一个愚蠢的问题。 我正在编写一段代码如下: char ar[]=”test”; *(ar+1)=’r’; 这工作正常。 但无论何时我这样做: char *p=”test”; *(p+1)=”r”; 这是分段错误 。 任何人都可以描述为什么第二种情况会给出分段错误? 从记忆的角度来解释将不胜感激。

使用XOR交换值

这两个宏有什么区别? #define swap(a, b) (((a) ^ (b)) && ((a) ^= (b) ^= (a) ^= (b))) 要么 #define swap(a, b) (((a) ^ (b)) && ((b) ^= (a) ^= (b), (a) ^= (b))) 我在这里看到了第二个宏但是不明白为什么它不像第一个那样写? 我错过了一个特殊原因吗?

C编程#define?

可能重复: 谁能解释这些未定义的行为(i = i ++ + ++ i,i = i ++等…) #include #include #define SQ(x) x*x void main() { int a1 , a2; int b1 , b2; a1 = 2; a2 = 2; b1 = 0; b2 = 0; b1 = SQ(a1++); b2 = SQ(++a2); printf(“Frist = %d”,b1); printf(“Second = %d”,b2); } 我知道代码的输出是什么。 因为#define在其他程序中工作,所以它不能在上面的代码中工作为什么。?

调用C函数,该函数不带参数参数

关于C调用约定和64/32位编译之间可能存在未定义的行为,我有一些奇怪的问题。 首先是我的代码: int f() { return 0; } int main() { int x = 42; return f(x); } 正如你所看到的,我用参数调用f,而f不带参数。 我的第一个问题是这个论点在调用时是否真的给了f。 神秘的线条 经过一点点objdump我得到了好奇的结果。 传递x作为f的参数: 00000000004004b6 : 4004b6: 55 push %rbp 4004b7: 48 89 e5 mov %rsp,%rbp 4004ba: b8 00 00 00 00 mov $0x0,%eax 4004bf: 5d pop %rbp 4004c0: c3 retq 00000000004004c1 : 4004c1: 55 push […]

通过并集和位移读取双平台字节序,是否安全?

我所看到的所有从缓冲区到平台字节序读取已知字节序的两倍的例子包括检测当前平台的字节顺序并在必要时执行字节交换。 另一方面,除了使用位移的整数( 一个这样的例子 )之外,我已经看到了另一种做同样事情的方法。 这让我觉得有可能使用union和bitshift技术从缓冲区中读取双精度(和浮点数),并且快速测试实现似乎有效(至少在x86_64上使用clang): #include #include #include double read_double(char * buffer, bool le) { union { double d; uint64_t i; } data; data.i = 0; int off = le ? 0 : 7; int add = le ? 1 : -1; for (int i = 0; i < 8; i++) { data.i |= ((uint64_t)(buffer[off] […]

C中strncpy的内存混淆

本周我的同事讨论了一个关于记忆的问题: 示例代码1: int main() { #define Str “This is String.” char dest[1]; char buff[10]; strncpy(dest, Str, sizeof(Str)); printf(“Dest: %s\n”, dest); printf(“Buff: %s\n”, buff); } 输出: Dest: This is String. Buff: his is String. 示例代码2: int main() { #define Str “This is String.” char dest[1]; //char buff[10]; strncpy(dest, Str, sizeof(Str)); printf(“Dest: %s\n”, dest); //printf(“Buff: %s\n”, buff); […]

宏和后增量

这是一些奇怪的宏观行为,我希望有人可以阐明: #define MAX(a,b) (a>b?a:b) void main(void) { int a = 3, b=4; printf(“%d %d %d\n”,a,b,MAX(a++,b++)); } 输出为4 6 5. b的值增加两次,但在MAX显示其值之前不增加。 任何人都可以告诉我为什么会这样,以及如何预测这种行为? (应避免使用宏的另一个例子!)

C中的(空)无限循环未定义行为?

是for (;;);的无限循环for (;;); C中的未定义行为? (这是针对C ++的 ,但我不知道C.)

是while(1); C中的未定义行为?

在C ++ 11中,它是未定义的行为 ,但在C中是这样的, while(1); 是未定义的行为?

当浮点变量超出浮动限制时,会发生什么?

我说了两件事: std::numeric_limits::max()+(a small number) 给出: std::numeric_limits::max() 。 std::numeric_limits::max()+(a large number如: std::numeric_limits::max()/3) 给出 inf。 为何如此差异? 1或2会导致OVERFLOW导致未定义的行为吗? 编辑:测试此代码: 1。 float d = std::numeric_limits::max(); float q = d + 100; cout << "q: " << q << endl; 2。 float d = std::numeric_limits::max(); float q = d + (d/3); cout << "q: " << q << endl;