2017-06-18 10 views
0

私のコードは、指定された行にSIGSEGVを生成していますか?私は、コンパイラの実装によって、または読み取り専用に配置してもしなくてもよい、「K」(小文字)あなたは文字列リテラルを変更しようとしている文字へのポインタ - 関数内の逆参照

#include <stdio.h> 
    #include <stdlib.h> 
    #include<string.h> 
    struct node 
    { 
     int data; 
     struct node* next; 
    }; 
    void fun1(char** head) 
    { 
     printf("FUN2---%s",*head); 
    //this line produces a segmentation fault 
     **head='k'; 

    } 
    void fun(char** head) 
    { 
     printf("FUN---HEAD:%s\n",*head); 
     fun1(head); 
    } 

    int main() 
    { 
     char *ptr="KEWIN"; 
     printf("PTR:%p\n",ptr); 
     fun(&ptr); 

     printf("%s",ptr); 
     return 0; 
    } 
+5

*文字列リテラル*の最初の文字を変更しようとしています。 –

+0

...または[this one](https://stackoverflow.com/questions/164194/why-do-i-get-a-segmentation-fault-when-writing-to-a-string-initialized-with) -cha)が保護されています。 –

答えて

1

に私の文字列の最初の文字を変更したいですあなたのコンパイルされたプログラムのデータセグメント。読み取り専用データセグメントに配置されている場合は、そこに書き込もうとするとセグメンテーションが発生します。 char * nameではなく、あなたの名前をchar name []に​​すると、文字列がスタックに置かれ、そこに書き込むことができます。また、char **を関数に渡すと、不要なレベルの間接参照が追加されます。このコードを参照してください:

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

struct node 
{ 
    int data; 
    struct node* next; 
}; 
void fun1(char * head) 
{ 
    printf("FUN2---%s\n", head); 
    // no seg fault anymore 
    *head='k'; 

} 
void fun(char * head) 
{ 
    printf("FUN---HEAD:%s\n",head); 
    fun1(head); 
} 

int main() 
{ 
    char name[] = "KEWIN"; 
    printf("PTR:%p\n",name); 
    fun(name); 

    printf("%s",name); 
    return 0; 
} 
+0

標準によると、文字列リテラルを変更しようとすると、未定義の動作が発生します。完全停止。 –

+0

はい、説明できません。 –

関連する問題