【发布时间】:2020-04-27 08:29:11
【问题描述】:
在这段代码中:
int main()
{
char arr[5]="knot";
char *ptr, *ptr1;
int i;
ptr = &arr[1];
ptr1 = ptr + 3;
*ptr1 = 101;
for(i=0 ; i<4 ; i++)
printf("%c", *ptr++);
return 0;
}
输出恰好是note。
我理解的是行,ptr = &arr[1]; 指向 ptr 到原始数组的第二个内存位置,ptr1 = ptr + 3; 指向 ptr1 到空字符('\0')存储在原始数组中的位置.
之后*ptr1 = 101; 将原始数组中的空字符('\0')替换为e。之后,我从 ptr 指向最多 4 个字符的位置打印。
我对代码的解释是这样的
我不明白的是,虽然我将空字符('\0')替换为其他字符,但为什么
puts(arr);
或
for(i=0 ; i<10 ; i++)
printf("%c", arr[i]);
仍然打印note,而不是打印e 后的一些垃圾值。在第二个 for 循环语句中,我尝试打印超出其范围的数组,但它仍然打印 note。
会不会是e 之后的内存位置只包含空格?将来打印这样的字符串/字符数组是否安全?
PS:我使用的是 gcc (tdm64-1) 5.1.0
【问题讨论】:
-
puts(arr)(删除空终止符后)和越界访问数组都会调用 未定义的行为 - 任何事情都可能在此时发生,包括看似正确的结果