繁体   English   中英

为什么此C代码进入循环?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM