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不知道内存被分配到哪里,也不知道为什么他不能写入内存。