【问题标题】:Dereferencing char pointer causes segfault取消引用 char 指针会导致段错误
【发布时间】:2016-02-08 22:11:15
【问题描述】:

我正在使用strchr 在缓冲区中查找遇到= 的点。然后我将那个相等的字符更改为M。我在尝试执行此操作的行出现段错误。

这是完整代码:

int main(void){
    char *buffer = "Name=Tom"
    char *pointer;
    pointer = strchr(buffer,'=');
    *pointer = 'M';    <--------- Segfault Occurs here
return (0);
}

我收到以下与段错误有关的错误:

Process terminating with default action of signal 11 (SIGSEGV)
 Bad permissions for mapperd region at addresss .....

【问题讨论】:

  • 请提供minimal complete and verifiable example。您甚至没有提供对问题至关重要的buffer 的定义和内容。例如,如果buffer 包含一个字符串常量或不包含任何= 字符,那么您将得到一个段错误。但是用你提供的不完整的代码是不可能的。
  • 可能找不到字符'=',strchr返回NULL
  • @JohnDoe 现在您终于添加了代码,很明显(正如多人猜测的那样)您正在尝试更改字符串文字。字符串文字不可写。修改 buffer 声明,使其改为 char 数组:char buffer[] = "Name=Tom";
  • @DavidHoelzer 我添加了完整的代码。

标签: c segmentation-fault


【解决方案1】:

您没有检查strchr 的返回值,它可能是NULL,因为我们没有看到您的输入。

除此之外,buffer 在哪里以及如何声明?并非所有char* 都可以修改,因为它们可以存储在二进制文件的数据段中(作为字符串文字)。

【讨论】:

  • 它不为 NULL。当段错误发生时,我添加了错误 valgrind 显示。
  • 那么原因就是我指出的第二个原因。该文字是只读的,它存储在数据段中,尝试使用 char[] buffer = ".."。
【解决方案2】:

您正在尝试修改将存储在只读内存段中的字符串文字的值。这会导致访问冲突。

问题出在这里:

char *buffer = "Name=Tom";

修改为:

char buffer[] = "Name=Tom";

【讨论】:

  • 这个方法的问题在于,由于你没有指定缓冲区的大小,它会自动设置为“Name=Tom”的长度加上“\0”的长度。所以如果你想放置一个比当前字符串长的字符串,它会报错。参考这篇旧帖stackoverflow.com/questions/6803387/…
  • @RatanSenapathy 我认为你完全没有抓住重点。我完全知道如何分配内存...... OP 不知道该内存被分配到哪里以及为什么他不能写入它。
【解决方案3】:

你在这里做错了:

char *buffer = "Name=Tom";

当您将字符串文字分配给指针时,它会存储为 const char*,无法修改,这是您稍后在代码中尝试执行的操作。

这里,你首先需要给buffer分配内存,然后使用strcpy复制如下内容:

char buffer[100];
strcpy(buffer, "Name=Tom");

【讨论】:

  • 这是不正确的,艾哈迈德。尝试编译它并尝试一下。它默默地创建了一个const char *
  • 或者只是 char buffer[] = "Name=Tom";David Hoelzer showed
猜你喜欢
  • 2018-10-19
  • 1970-01-01
  • 2023-03-26
  • 1970-01-01
  • 2015-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-14
相关资源
最近更新 更多