2016-10-20 35 views
0

在下面的程序,SIGSEGV关于修改的char *元素

#include<stdio.h> 
#include<stdlib.h> 
int main(){ 
    const char *str1 = "abc"; 
    char *str2 = (char *)malloc(sizeof(char)*4); 
    str2= "def"; 
    str2[1]='s'; 
    printf("str2 is %s", str2); 

} 

调试器:

(gdb) ptype str1                               
type = const char *                              
(gdb) ptype str2                               
type = char *                                
(gdb) n                                 
7   str2[1]='s';                             
(gdb) n    

Program received signal SIGSEGV, Segmentation fault.                      
0x00000000004005ab in main() at main.c:7                         
7   str2[1]='s';                             
(gdb) 

SIGSEGV上str2[1] = 's';

按我的理解,一个不能修改abcst1指向,由于声明const char *st1 = "abc",其中字符串常量是常量。

为什么char *类型str2不允许修改元素? stringliteral def也是一个常量字符串文字。

+0

[不要在C中输入'malloc'的结果](http://stackoverflow.com/q/605845/995714) –

+0

[改变字符串值抛出分段错误](http://stackoverflow.com/q/3550171/995714) –

回答

2

这是发生了什么:

  1. str2分配与malloc()和点4个字符

  2. 新分配的缓冲区您将str2的值(地址)更改为地址"def",该地址为只读(将其视为程序的一部分)

  3. 您试试改变"def"

  4. 你是不是能够释放内存,因为你确实失去了它的地址,当您分配str2"def"

0

str2 = "def";声明更改str2的值。 str2指向导致下列崩溃的赋值之后的字符串文字“def”。至少,它是如此的对我的RHEL 7.1用gcc 4.8.3

1

地址按Ç执行标准

字符串字面("def")将以只读页面的形式存储在数据部分。

所以你不能修改它的内存。


您可以修改str2指针的内容。这意味着你可以将str2指向其他内存。但内存分配为string literal "def"不能修改。


str2= "def"; 

通过在您的malloc内存这样做,你没有抄袭“高清”。 取而代之的是“def”在只读区域获得分配,并且您将其地址分配给str2。

如果要将该“def”存储到malloced空间,请使用 strcpy memcpy。

0

如果要在刚刚分配的字符串缓冲区中存储“abc”,则必须使用strcpy(),如strcpy(str2, "abc")中所述。正如其他用户所指出的那样,使用str2 = "abc"将改变内存地址str2指向的地址,而不是这样做,并且该新地址指的是不可修改的只读部分。

-1

问题:

char *str2 = (char *)malloc(sizeof(char)*4); 

这意味着你已经在你的个人使用的存储要求4个字节的空间,并且您已经被授予的空间的起始地址。

str2= "def"; 

你有你的个人地址,但现在你改变你的地址指向属于只读存储器(字符串)中的数据部分迷人的“高清”。这意味着分配的原始地址悬而未决,无法追溯。

问题:

  • 悬挂指针,其中,所述地址是不可追踪的。
  • 你将无法释放它。

str2[1]='s';

喔,现在你正试图通过尝试改变只读部分的内容是一个叛逆者。

问题:

  • 试图覆盖这是不允许的只读段。

  • SIGSEGV是由于无效内存引用或分段错误导致错误(信号)的原因。

什么你可能实际上是想:

  • 分配内存为您的作品(4个字节)
  • 改写内容到内存strcpy(str2, "def");
  • str2[1] = 's'也将随后工作。
  • 请确保释放str2变量,因为您是需要它的人。 (随着强大的来临,责任重大);)