C中strcpy函数后的变量值更改

C中strcpy函数后的变量值更改,c,C,我注意到strcpy函数之后变量值发生了变化,我不知道这是怎么发生的,也不知道为什么会发生。 这是我的代码: #include <stdio.h> #include <string.h> int main() { int b = true; char ch[3]; strcpy(ch,"int"); printf("b value is:%d\n",b); return 0; } #包括 #包括 int main() { in

我注意到strcpy函数之后变量值发生了变化,我不知道这是怎么发生的,也不知道为什么会发生。 这是我的代码:

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

int main()
{
    int b = true;
    char ch[3];
    strcpy(ch,"int");
    printf("b value is:%d\n",b);

    return 0;
}
#包括
#包括
int main()
{
int b=真;
char-ch[3];
strcpy(ch,“int”);
printf(“b值为:%d\n”,b);
返回0;
}
我甚至使用了一个临时整数变量。非常奇怪的是,在这种情况下,strcpy之后的b值是正确的,但是temp被更改为0,请注意,这只是在为b和temp变量赋值1时发生的。 这是第二个代码

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

int main()
{
    int b = true;
    int tmp=b;
    char ch[3];
    strcpy(ch,"int");
    printf("b value is:%d\n",b);

    return 0;
}
#包括
#包括
int main()
{
int b=真;
int tmp=b;
char-ch[3];
strcpy(ch,“int”);
printf(“b值为:%d\n”,b);
返回0;
}
相当于

ch[0] = 'i';
ch[1] = 'n';
ch[2] = 't';
ch[3] = 0;
由于
ch
只有三个元素(
ch[0]…ch[2]
),这将调用未定义的行为。

我使用并选择了“C++”,并且没有发生错误。 但是当我选择C++17时,我得到了这个警告 输入 main.cpp:9:12:警告:“void uu内置u memcpy(void*,const void*,long unsigned int)”将4个字节写入大小为3的区域 w=]“*


正如@PaulMcKenzie提到的,这是缓冲区溢出情况。

首先,您需要在布尔变量中使用数字(0,1)。在C++中,如果希望在C中使用布尔值,则必须包含STDBOOL .H库。

关于strcpy(dest,src)函数,它将src字符串复制到dest,并返回指向复制字符串的指针

实际上,“int”的大小不是3个字节,而是4个字节。字符串始终以“\0”字符结尾

换言之:

如果您不理解,请尝试分析以下代码:

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

   int main()
    {
        int b = 1;
        char ch[4];
        strcpy(ch,"int");
        printf("b value is:%d\n",b);

        return 0;
}
#包括
#包括
int main()
{
int b=1;
char-ch[4];
strcpy(ch,“int”);
printf(“b值为:%d\n”,b);
返回0;
}

请只将您使用的语言标记为(C或C++,但不是两者都)。将示例复制到编译器资源管理器中会产生一个警告:‘Vuff*yBuuthTiNiMeMcPy(空洞*,const Value*,长无符号int)’将4字节写入到大小为3的区域溢出目的地[-WSTRINGOP溢出= ]我不知道这是怎么发生的,也不知道为什么会发生——原因是缓冲区溢出——计算机程序中最易被利用的部分之一。你可以看到它是如何改变你的数据的——这正是黑客会做的。因此,使用
std::string
,这些东西不存在(或很少存在)。这不一定是缓冲区溢出情况。。最好称之为未定义行为。@Wedapasi,这是缓冲区溢出,缓冲区溢出的结果是未定义行为。起初我以为你错了,但现在我意识到了。感激的
#include <stdio.h>
#include <string.h>

   int main()
    {
        int b = 1;
        char ch[4];
        strcpy(ch,"int");
        printf("b value is:%d\n",b);

        return 0;
}