2016-10-20 86 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變量,因爲您是需要它的人。 (隨着強大的來臨,責任重大);)