【问题标题】:C—segfault when modifying dataC——修改数据时的段错误
【发布时间】:2015-02-22 03:23:20
【问题描述】:

关于我之前关于显示特定数据地址的内容的问题,我现在尝试修改各个地址的内容。这似乎是一个足够简单的任务,但每次尝试时都会出现段错误。我正在使用以下功能:

int mem_set(Cmd *cp, char *arguments)
{
    int address = 0, value = 0;
    char *location;

    if(sscanf(arguments, "%x %x", &address, &value) == 2)
    {
        location = (char*)address;
        *location = value;
    }
    else printf("Invalid input.\n");
    return 0;
}

我应该能够通过找到它的地址并将其替换为正确的十六进制值来将表中的项目(在这个文件中)从“s”更改为“x”,但是当我得到一个段错误时它到达*location = value;。有什么想法吗?

谢谢!

【问题讨论】:

  • 我很困惑:你到底想改变什么?您是否尝试更改程序内存的内容?您是否要更改内存中表的内容?您是否尝试更改文件的内容?
  • 我正在尝试更改 .c 文件中的内容,特别是命令表,以便“x”将调用退出函数,其命令当前为“s”。
  • 当您说“.c 文件中的内容”时,您的意思是要更改正在运行的程序的一部分(因为当它运行时,它不再是.c 文件)?
  • 据说,我可以在程序运行时使用此命令来更改程序。问题的确切措辞是“在导师程序运行时将停止命令从's'更改为'x'”。 Tutor 是我正在运行的程序的名称,停止命令在一个名为 cmds.c 的文件中,该文件是程序所依赖的。抱歉,如果这没有太大帮助,我最近的(也是第一次)C 课程是两个学期前。
  • 坏消息:你在解决这个问题的路上走错了路。大错特错。与其在运行时修改程序(这远远超出了您的技能水平......而且几乎一开始就不应该这样做......而且在某些平台上甚至是不可能的),而是尝试改变程序,以便停止命令的键存储在一个变量中,然后您可以在运行时修改该变量(而不是在运行时修改程序)。简短的回答:您正在以可以想象的最困难的方式解决一个非常简单的问题。

标签: c pointers memory segmentation-fault


【解决方案1】:

你在这里给一个指针赋值一个整数

location = (char*)address;

应该是

location = (char*)&address;

您需要获取address 的地址而不是它的值。

这是否会做你想做的事,是另一回事,但这是你的程序调用未定义行为的原因,这可能导致分段错误。

【讨论】:

  • 它摆脱了段错误,但我不认为它正在做我现在需要它做的事情。我有另一个名为 mem_display 的函数,它使用同一行 location = (char*)address; 来查找该地址处的位。到目前为止,它运行良好——我已经能够在我的代码中找到一些字符串文字和东西。我只想说,将其中一个字符串文字中的随机字符更改为 X 或类似的东西。
  • 你不能改变字符串文字,这是未定义的行为。
猜你喜欢
  • 1970-01-01
  • 2010-12-27
  • 2017-01-07
  • 1970-01-01
  • 1970-01-01
  • 2017-02-26
  • 2019-03-31
  • 2016-05-03
相关资源
最近更新 更多