【问题标题】:Why is this having trouble storing illegal the character? [closed]为什么这在存储非法字符时遇到问题? [关闭]
【发布时间】:2020-01-02 20:29:35
【问题描述】:

这是我大学的练习。目标是进行非法内存存储和非法内存访问,并将其打印在 char 中。但是,使用 MALLOC 的内存地址不存储 'y',并且使用 char x 有效。 为什么会有这种差异?但是当我使用 char x 时,它会显示我想要的内容,但是,最后会显示此文本“* stack smashing detected *: terminate Abortado (imagem do núcleo gravada)"

void ilegal_store(char *u)
{
    for(int i=0;i<100;i++){
        *(u+i) = 'y';
    }   
}

void ilegal_reading(char *u)
{
    for(int i=0;i<100;i++){
        printf("%d = %d\n",i,*(u+i));
    }
}

void main()
{
    //char x; WORKS
    char *x=(char *)malloc(sizeof(char)); //USING MALLOC HAS ADRESSES WHICH DOESN'T STORE THE 'y' by ilegal_store();
    if(x!=NULL){
        ilegal_store(x); //use &x when not pointer
        ilegal_reading(x); //use &x when not pointer
    }
}

【问题讨论】:

  • 你说“不起作用”是什么意思?如果您正在访问数组之外​​的内存,则代码具有未定义的行为。
  • 好的,谢谢。我知道这一点,我希望这种非法访问可以更好地理解 C。如果我使用 (printf("\n%d = %c", *(p+i), *(p+i))跨度>
  • 假设没有 UB,printf 正在缓冲其输出(并且可能仅在打印换行符时刷新它)。尝试在printf 之后添加fflush(stdout)
  • “不起作用”不是对您的问题的非常有用的描述。请始终包括您期望的输出、获得的输出以及提供的输入。当你的程序“不工作”时,你的程序会做什么?
  • @BrendonRusPeres 如果我们还没有将您赶走,请尝试 mosvy 的建议,并在您的 printf 后添加 fflush(stdout)%c。很有可能这就是问题所在。

标签: c


【解决方案1】:

C 标准不允许您取消引用指向您不拥有的内存的指针。尝试这样做的行为是未定义的。未定义的行为表现在许多好奇心中,例如有时“工作”,有时不“工作”,或者编译器甚至删除了那个特定的分支:允许假设未定义的行为不会发生。

您可能不会在第一次未定义的取消引用时发生崩溃。因为printf 的输出经常被缓冲,因此经常滞后于生成输出的代码,您可以通过flushing为未注释的情况生成额外的输出> 每次使用fflush(stdout) 迭代后的缓冲区。在您引用为工作的情况下,换行符的存在也可以刷新缓冲区。产生不同行为的可能是换行符。

最后,无论怎么装扮,你都在规避语言对你的限制。如果您想规避这些限制,那么您需要使用不同的语言。许多 C 编译器支持内联汇编。这就是您需要在本例中使用的内容。

【讨论】:

  • 都非常正确,但这并不能回答问题。
  • 他发现他可以使用"%d %c \n"访问和打印内存——或者至少是其中的一部分。他想知道为什么当他使用"%c" 时根本没有输出。我怀疑答案正如@mosvy 的评论所建议的那样。
  • 看,我可以像下一个家伙一样使用“它是 UB,所以不要想它”锤子,但在某些时候,用它无意义地抨击提问者是没有帮助的,这是其中一种情况。您的回答甚至完全没有解决(更不用说回答)OP 问题的主旨。
  • @SteveSummit:在这点上我们必须不同意。对我来说,“目标是进行非法内存访问并以字符形式打印。”是重要的一点。这是不可能的。我已经给出了很多分析 UB 的答案,这是我最近的stackoverflow.com/questions/57628986/…
  • 郑重声明,我也不同意“你需要使用内联汇编”,但小机器人警告我关于扩展讨论并询问我是否要将其移至聊天,但我不' t,所以我现在就停下来。
猜你喜欢
  • 2020-03-06
  • 2020-09-21
  • 1970-01-01
  • 2013-09-14
  • 2013-05-19
  • 2016-11-04
  • 1970-01-01
  • 2012-09-07
  • 2021-10-09
相关资源
最近更新 更多