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结果,如果你想确切地知道在任何给定机器上会发生什么,编译它,然后查看生成的汇编代码。这是唯一可以确定的方法。