strcpy的奇怪程序输出

strcpy的奇怪程序输出,c,C,这里我有一个非常简单的程序,输出对我来说非常奇怪 #include "stdio.h" #include "string.h" void func_stack(); int main(int argc, char *argv[]) { func_stack(); } void func_stack() { int a = -1; char s[4]; int b = -1; strcpy(s,"1234"); printf("a+b res

这里我有一个非常简单的程序,输出对我来说非常奇怪

#include "stdio.h"
#include "string.h"

void func_stack();

int main(int argc, char *argv[]) {
    func_stack();
}

void func_stack() {
    int a = -1;
    char s[4];
    int b = -1;

    strcpy(s,"1234");
    printf("a+b result to %d\n",a+b);
}
我猜strcpy函数使用“\0”覆盖了后面的int变量“b”,并给出了一个奇怪的计算结果,但在x86 linux机器上编译后,仍然得到了-2作为结果,这与没有发生strcpy是相同的结果


任何人都可以解释为什么会发生这种情况?

C字符串以NUL结尾。使用
strcpy()
“1234”
复制到
s
时,实际上复制了五个字节,包括NUL终止符。然后,您的写入超出了
s
数组的边界,因此调用了未定义的行为


运行此命令时实际发生的情况将取决于您的CPU体系结构和编译器(以及编译器选项、优化等)。

C字符串以NUL结尾。使用
strcpy()
“1234”
复制到
s
时,实际上复制了五个字节,包括NUL终止符。然后,您的写入超出了
s
数组的边界,因此调用了未定义的行为


运行此命令时实际发生的情况将取决于CPU体系结构和编译器(以及编译器选项、优化等)。

将数组大小更改为+1

例:
“您”
因此数组大小为3+1>>字符s[4]

因此,对于您的代码
“1234”
数组大小为4+1>>字符s[5]

最后一个字节用于
NULL
作为字符串的结尾


CMIIW将数组大小更改为+1

例:
“您”
因此数组大小为3+1>>字符s[4]

因此,对于您的代码
“1234”
数组大小为4+1>>字符s[5]

最后一个字节用于
NULL
作为字符串的结尾


CMIIW

您的
strcpy
正在尝试复制5个字符。i、 e.
1234\0
转换为4个字符的数组。这就是为什么当它覆盖堆栈上的某些内容时,您会观察到这种行为。

您的
strcpy
正在尝试复制5个字符。i、 e.
1234\0
转换为4个字符的数组。这就是为什么当它覆盖堆栈上的某些内容时,您会观察到这种行为。

正如Greg所说,您正在调用未定义的行为,因此任何事情都可能发生。您正在使用的机器是64位的吗?如果是这样,那么变量可能是单词对齐的,因此在整数之前有额外的4个字节的填充。

正如Greg所说,您正在调用未定义的行为,因此任何事情都可能发生。您正在使用的机器是64位的吗?如果是这样,变量可能是字对齐的,因此
s
在整数之前有额外的4个字节的填充。

因为你在做a=b=-1,它们中的所有位都应该是1。 使用调试器或printf,您可以通过检查

&s[4], 
((char*)&a) and ((char*)&a)+(sizeof(int)-1),
((char*)&b) and ((char*)&b)+(sizeof(int)-1)

如果a&b的地址与s[0]不重叠。。s[4],然后得到结果-2。

因为你做的是a=b=-1,所以它们中的所有位都应该是1。 使用调试器或printf,您可以通过检查

&s[4], 
((char*)&a) and ((char*)&a)+(sizeof(int)-1),
((char*)&b) and ((char*)&b)+(sizeof(int)-1)

如果a&b的地址与s[0]不重叠。。s[4],然后得到结果-2。

我已经在sparc机器上编译了它,它也给出了-2结果,如果您想确切知道在任何给定机器上会发生什么,请编译它,然后查看生成的汇编代码。这是唯一可以确定的方法。我已经在sparc机器上编译了它,它也给出了-2结果,如果你想确切地知道在任何给定机器上会发生什么,编译它,然后查看生成的汇编代码。这是唯一可以确定的方法。