Khr*_*yus 2 c ascii pointers ansi overflow
感谢您的回复,每个人都有助于我了解这是如何工作的.
一位朋友发给我这段C代码询问它是如何工作的(他也不知道).我通常不和C合作,但这引起了我的兴趣.我花了一些时间试图了解发生了什么,但最终我无法完全理解它.这是代码:
void knock_knock(char *s){
while (*s++ != '\0')
printf("Bazinga\n");
}
int main() {
int data[5] = { -1, -3, 256, -4, 0 };
knock_knock((char *) data);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
起初,我以为这只是阵列中的打印数据的奇特的方式(是的,我知道:\),但是当我看到它没有打印"Bazinga" 5次,我很惊讶,但8.我搜索的东西并计算出它与指针的工作(总业余当谈到C),但我为什么8.我搜索了一点,发现了通常的指针有8个字节长度的C仍然无法弄清楚,并我通过在循环之前打印sizeof(s)来验证,确定它是8.我认为这是它,它只是在指针的长度上迭代,所以它打印Bazinga 8次是有意义的.现在我还清楚为什么他们会使用Bazinga作为打印的字符串 - 数组中的数据只是让人分心.所以我尝试向阵列添加更多数据,果然它会继续打印8次.然后我更改了数组的第一个数字-1,以检查数据是否真的没有意义,这就是我感到困惑的地方.它不再打印8次,但只打印一次.当然阵列中的数据不仅仅是一个诱饵,但对于我的生活,我无法弄清楚发生了什么.
使用以下代码
#include<stdio.h>
void knock_knock(char *s)
{
while (*s++ != '\0')
printf("Bazinga\n");
}
int main()
{
int data[5] = { -1, -3, 256, -4, 0 };
printf("%08X - %08X - %08X\n", data[0], data[1], data[2]);
knock_knock((char *) data);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
你可以看到data数组的HEX值是
FFFFFFFF - FFFFFFFD - 00000100
Run Code Online (Sandbox Code Playgroud)
功能knock_knock打印Bazinga,直到尖值是0x00由于
while (*s++ != '\0')
Run Code Online (Sandbox Code Playgroud)
但是这里的指针指向字符,所以每个循环指向一个字节,因此,第一个0x00到达访问数组第三个值的"第一个"字节.