在C中更改存储在变量中的内存地址

在C中更改存储在变量中的内存地址,c,memory-management,buffer,C,Memory Management,Buffer,我有以下C程序,我想通过更改内存地址来更改变量secret。你能给我举个例子吗,我应该为下面的两个输入输入输入什么来完成这一点。任何帮助都将非常感激 #include <stdio.h> #include <stdlib.h> #include <fcntl.h> unsigned secret = 0xdeadbeef; int main(int argc, char **argv){ unsigned *ptr; unsigned va

我有以下
C
程序,我想通过更改内存地址来更改变量
secret
。你能给我举个例子吗,我应该为下面的两个输入输入输入什么来完成这一点。任何帮助都将非常感激

#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>

unsigned secret = 0xdeadbeef;

int main(int argc, char **argv){
    unsigned *ptr;
    unsigned value;


    printf("Welcome! I will grant you one arbitrary write!\n");
    printf("Where do you want to write to? ");
    scanf("%p", &ptr);
    printf("Okay! What do you want to write there? ");
    scanf("%p", (void **)&value);

    printf("Writing %p to %p...\n", (void *)value, (void *)ptr);
    *ptr = value;
    printf("Value written!\n");

    if (secret == 0x1337beef){
        printf("Woah! You changed my secret!\n");
        exit(0);
    }

    printf("My secret is still safe! Sorry.\n");
}
#包括
#包括
#包括
未签名的秘密=0x0;
int main(int argc,字符**argv){
无符号*ptr;
无符号值;
printf(“欢迎!我将允许您任意书写!\n”);
printf(“你想写信到哪里?”);
扫描频率(“%p”和“ptr”);
printf(“好的!你想在那里写什么?”);
scanf(“%p”,(void**)和value);
printf(“将%p写入%p...n”,(void*)值,(void*)ptr);
*ptr=值;
printf(“写入的值!\n”);
if(secret==0x1337 eef){
printf(“哇!你改变了我的秘密!\n”);
出口(0);
}
printf(“我的秘密仍然安全!对不起。\n”);
}

如果可以,请给我举个例子

制作一个变体,打印
secret
的地址。编译并运行变量程序


编辑:地址和分配的详细信息是特定于实现的。因此,仅仅从C标准中无法发现这个数字。
printf(“%p”,…
(受
scanf(“%p”,…
)影响)返回的值取决于特定的操作系统和编译器的特定设置。例如,我在我的Windows机器上有两个版本的
gcc
,一个在Cygwin下,另一个在MinGW下。如果
printf(“%p””,这将非常令人惊讶,一些_static_variable)
在两种环境中打印相同的值。

只需添加一个
printf(“机密地址为:%p”,&secret);
在其他任何内容之上,然后在运行程序时,给第一个输入它打印出来的实际地址(&secret),给第二个输入程序“1337beef”例如,在我的机器上,它声明变量secret位于0x804a02c,因此对于第一个输入,我给它“804a02c”,对于第二个“1337beef”,它输入if语句。祝您玩得开心。

此行:scanf(“%p”((void)&value);正在将值的地址强制转换为空。scanf只关心地址和格式转换,因此(void**)是无用的。写入用户提供的某个地址(某个随机地址)是使程序崩溃的好方法,可能是seg错误。