C 取消引用字符指针会导致segfault

C 取消引用字符指针会导致segfault,c,segmentation-fault,C,Segmentation Fault,我正在使用strchr查找缓冲区中遇到=的点。然后,我将该equal-too字符更改为M。在我尝试这样做的线路上有一个故障 这是完整的代码: int main(void){ char *buffer = "Name=Tom" char *pointer; pointer = strchr(buffer,'='); *pointer = 'M'; <--------- Segfault Occurs here return (0); } 您没有检查st

我正在使用
strchr
查找缓冲区中遇到
=
的点。然后,我将该equal-too字符更改为
M
。在我尝试这样做的线路上有一个故障

这是完整的代码:

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

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


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

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


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

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

问题在于:

char *buffer = "Name=Tom";
修改为:

char buffer[] = "Name=Tom";

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

问题在于:

char *buffer = "Name=Tom";
修改为:

char buffer[] = "Name=Tom";

你在这里做的是错误的:

char *buffer = "Name=Tom";
当您将字符串文字指定给指针时,它将存储为
常量char*
,无法修改,这是您稍后在代码中尝试执行的操作

在这里,您首先需要将内存分配给
缓冲区
,然后使用
strcpy
复制如下内容:

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

你在这里做的是错误的:

char *buffer = "Name=Tom";
当您将字符串文字指定给指针时,它将存储为
常量char*
,无法修改,这是您稍后在代码中尝试执行的操作

在这里,您首先需要将内存分配给
缓冲区
,然后使用
strcpy
复制如下内容:

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


请提供一份报告。您甚至没有提供对问题至关重要的
缓冲区的定义和内容。例如,如果
buffer
包含字符串常量或不包含任何
=
字符,则会出现seg故障。但是不可能用您提供的不完整的代码来说明。可能找不到字符“=”,并且strchr返回null由于这个问题似乎设计成一个猜测游戏,我怀疑您是这样声明缓冲区的:
char*buffer=“a buffer=something
,使其成为常量文本值且为只读。@JohnDoe现在您终于添加了代码,很明显(正如多人猜测的那样)您正在尝试更改字符串文本。字符串文字不可写。修改
buffer
声明,将其改为字符数组:
charbuffer[]=“Name=Tom”@DavidHoelzer我添加了完整的代码。请提供一个。您甚至没有提供对问题至关重要的
缓冲区的定义和内容。例如,如果
buffer
包含字符串常量或不包含任何
=
字符,则会出现seg故障。但是不可能用您提供的不完整的代码来说明。可能找不到字符“=”,并且strchr返回null由于这个问题似乎设计成一个猜测游戏,我怀疑您是这样声明缓冲区的:
char*buffer=“a buffer=something
,使其成为常量文本值且为只读。@JohnDoe现在您终于添加了代码,很明显(正如多人猜测的那样)您正在尝试更改字符串文本。字符串文字不可写。修改
buffer
声明,将其改为字符数组:
charbuffer[]=“Name=Tom”@DavidHoelzer我添加了完整的代码。它不是空的。我添加了当segfault发生时valgrind显示的错误。然后原因是我指出的第二个。该文本是只读的,存储在数据段中,请尝试使用char[]buffer=“..”。它不是空的。我添加了当segfault发生时valgrind显示的错误。然后原因是我指出的第二个。该文本是只读的,存储在数据段中,请尝试使用char[]buffer=“..”。这是不正确的,Ahmed。试着编译它,然后试用它。它正在无声地创建一个
const char*
。或者只是
char buffer[]=“Name=Tom”as。这是不正确的,艾哈迈德。试着编译它,然后试用它。它正在无声地创建一个
const char*
。或者只是
char buffer[]=“Name=Tom”as。此方法的问题在于,由于您没有指定缓冲区的大小,它会自动设置为“Name=Tom”的长度加上“\0”的长度。因此,如果要放置比当前字符串长的字符串,它将给出一个错误。参考这篇老帖子@RatanSenapathy,我认为你完全没有抓住要点。我完全知道如何分配内存。。。OP不知道该内存被分配到何处以及为何无法写入。此方法的问题在于,由于您没有指定缓冲区的大小,因此它会自动设置为“Name=Tom”的长度加上“\0”的1。因此,如果要放置比当前字符串长的字符串,它将给出一个错误。参考这篇老帖子@RatanSenapathy,我认为你完全没有抓住要点。我完全知道如何分配内存。。。OP不知道内存被分配到哪里,也不知道为什么他不能写入内存。