[英]Why This C Code Goes into Loop?
#include <stdio.h>
#include <stdint.h>
int p()
{
char data[7]="Hello!\0";
uint64_t *ptr=((uint64_t)data + 0x18);
printf("%s",data);
(*ptr)-=10;
return 0x00;
}
int main(int argc,char **argv)
{
p();
}
如其他答案和注释中所述,编写char data[7]="Hello!\\0";
可能是一个问题,但我认为这不是问题的唯一来源。
我的猜测是: uint64_t *ptr=((uint64_t)data + 0x18);
(*ptr)-=10;
通过这样做,您可能正在修改堆栈中的返回地址或执行类似的操作。
您所拥有的是未定义的行为。
char data[7]="Hello!\0";
越界写入数组会导致不确定的行为,这不是将字符串终止为null的正确方法,您可以选择以下选项之一。
更改为
char data[7]="Hello!";
你甚至可以拥有
char data[]="Hello!";
编辑:
通过做这个
uint64_t *ptr=((uint64_t)data + 0x18);
您正在将指针指向您未分配的某个内存位置。稍后尝试写入此位置
(*ptr)-=10;
因此,超出范围访问数组或写入一些您未分配的内存会导致未定义的行为。您需要首先修复它们
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.