gpt4 book ai didi

c - 向我解释以下 C 程序的输出

转载 作者:太空宇宙 更新时间:2023-11-04 00:25:04 24 4
gpt4 key购买 nike

请解释下面的例子。问题很简单,但结果很突然。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char *argv[])
{
int flag = 0;
char passwd[10];
strcpy(passwd, argv[1]);
if(0 == strcmp("LinuxGeek", passwd))
{
flag = 1;
}

if(flag)
{
printf("\n Password cracked \n");
}
else
{
printf("\n Incorrect passwd \n");

}
return 0;
}

标志的值在该行之后变为垃圾值

strcpy(passwd, argv[1]);

但是,如果我像这样定义变量标志,

int flag = 0 

行后

strcpy(passwd, argv[1]);

我得到了想要的结果。请简要说明一下。

最佳答案

简短的回答是,当 argv[1] 的长度大于九时,您的程序的行为是未定义的,因为那时您溢出了缓冲区 passwd

长答案显然是,您的编译器按照列出的顺序对堆栈中的变量进行排序,因此在 passwd 之后移动 flag 会在缓冲区后放置四个额外的零字节并且 strcmp 将其中之一识别为 passwd 上的 NUL 终止符。

解决问题的方法是跳过无用的复制:

char *passwd = argv[1];

或者完全删除passwd 变量并进行以下比较:

strcmp("LinuxGeek", argv[1])

关于c - 向我解释以下 C 程序的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21876828/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com