2016-02-08 47 views
-2

我正在使用strchr在遇到=的缓冲区中找到一个点。然后,我改变了这个性格与M相同。我在尝试执行此操作的行中遇到段错误。解引用字符指针会导致段错误

这是FULL代码:

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 ..... 
+2

请提供[最小完整和可核查的示例](https://stackoverflow.com/help/MCVE)。你甚至没有提供对这个问题至关重要的“缓冲区”的定义和内容。例如,如果'buffer'包含一个字符串常量或者不包含任何'='字符,那么你会得到一个seg错误。但不可能用你提供的不完整的代码来说。 – kaylum

+3

也许找不到字符'=',并且strchr返回NULL –

+0

因为这个问题似乎被设计为猜测游戏,所以我怀疑你已经声明了缓冲区:'char * buffer =“一个缓冲区= something',使它成为一个常量字面值并且是只读的 –

回答

7

你是不是检查strchr的返回值,也可能是NULL因为我们没有看到你的意见。

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

+0

它不是NULL。我添加了错误valgrind显示时发生段错误 –

+0

已加入全部代码。 –

+2

然后是我指出的第二个原因。该文字只读且存储在数据段中,请尝试char [] buffer =“..”。 – Jack

3

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

的问题是在这里:

char *buffer = "Name=Tom"; 

将其修改为:

char buffer[] = "Name=Tom"; 
+0

此方法的问题在于,由于您没有指定缓冲区的大小,因此它会自动设置为“Name = Tom”的长度加上'\ 0'的长度。所以如果你想放置一个比当前长的字符串,它会给出错误。参考这篇旧帖子 http://stackoverflow.com/questions/6803387/why-can-a-string-be-assigned-to-a-char-pointer-but-not-to-a-char-array –

+1

@RatanSenapathy我认为你完全忽略了这一点。我完全知道如何分配内存...... OP没有意识到内存被分配的位置以及为什么他不能写入内存。 –

0

什么,你在这里做的是错的:

char *buffer = "Name=Tom"; 

当你将一个字串一个指针被存储为const char*,它不能被修改,这是你以后要在你的系统中做的事情码。

在这里,你首先需要分配内存以buffer,然后使用strcpy的内容拷贝,如:

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

这是不正确的,艾哈迈德。尝试编译它并尝试一下。它默默地创建一个'const char *'。 –

+0

是的,你确实是对的。我在编辑。 –

+1

或者只是'char buffer [] =“Name = Tom”;'因为[David Hoelzer显示](http://stackoverflow.com/a/35280848/176646)。 – ThisSuitIsBlackNot