为什么这个C代码进入循环?

时间:2015-02-23 12:16:43

标签: c

#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();
}

2 个答案:

答案 0 :(得分:2)

正如其他答案和评论中所提到的那样char data[7]="Hello!\0";可能是一个问题,但我不认为这是问题的唯一来源。

我的猜测是: uint64_t *ptr=((uint64_t)data + 0x18);

(*ptr)-=10;  通过执行此操作,您可能正在修改堆栈中的返回地址或执行类似的操作。

答案 1 :(得分:1)

你所拥有的是未定义的行为。

char data[7]="Hello!\0";

写入数组越界导致未定义的行为。这不是null终止字符串的正确方法。您可以选择以下选项之一。

将其更改为

char data[7]="Hello!";

你甚至可以拥有

char data[]="Hello!";

<强>编辑:

通过这样做

uint64_t *ptr=((uint64_t)data + 0x18);

您正在指向某个未由您分配的内存位置。稍后您尝试写入此位置

(*ptr)-=10;

因此,访问数组越界或写入某些未由您分配的内存会导致未定义的行为。您需要先修复它们