有以下代码,我需要返回一个低于 0x30 且不等于 0 或 2 的访问级别:
int login() {
int accessLevel = 0xff;
char username[16];
char password[32];
printf("Username (max 15 characters): ");
gets(username);
printf("Password (max 31 characters): ");
gets(password);
if (!strcmp(username, "admin") && !strcmp(password, "{{ create_long_password() }}")) {
accessLevel = 2;
} else if (!strcmp(username, "root") && !strcmp(password, "{{ create_long_password() }}")) {
accessLevel = 0;
} else if (!strcmp(username, "artist") && !strcmp(password, "my-password-is-secret")) {
accessLevel = 0x80;
}
return accessLevel;
}
我输入了用户名 16 'a',它将 accessLevel 重置为 0(然后添加了将访问设置为 20 并为我提供所需输出的空间)。但是,我希望缓冲区覆盖密码,而不是 accessLevel,因为它是“后续记忆”。我想我误解了缓冲区的工作原理并希望得到解释。另外,为什么第 16 个字符重置为 0?
提前致谢!
局部变量栈上(假设有排序是堆叠)不保证在任何特定的顺序。它在很大程度上取决于变量的类型和每个变量所需的对齐方式,并且可以根据编译器或优化设置而改变。
在这种情况下,听起来变量是按照它们在代码中出现的顺序压入堆栈的,这意味着它们的地址会逐渐减少。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句