2017-03-25 8 views
0

私は時間を費やして助けを求めました。私はポインターの使い方で非常に初心者です。私はすでに壁に立ち向かっています。私はエラーSegmentation fault (core dumped)を得続けます。 (:私は、xとyを初期化し、それでも同じ障害を持って編集。)基本的なポインタの使い方:セグメンテーションフォールト、コアダンプ

ながら図のようにクエストに

int main(int argc, char *argv[]) { 
    char *x = "hello";     /* string 1 */ 
    char *y = "world";     /* string 2 */ 
    int n = 3;       /* number of characters to copy */ 

    for (int i=0; i<=n; i++) { 
     if(i<n) { 
     *x++ = *y++;     /* equivalent of x[i] = y[i] ? */ 
     printf("%s\n", x);    /* just so I can see if something goes wrong */ 
     } else { 
     *x++ = '\0';     /* to mark the end of the string */ 
     } 
    } 
} 

:私は、ポインタを使用して)はstrncpy(の簡易版を作成しようとしていますこれの一部が間違っていたものを、私は別の単純なポインタの事を試みた:

int main(int argc, char *argv[]) { 
    char *s; 
    char *t; 
    int n;        /* just initilaizing everything I need */ 

    printf("Enter the string: "); 
    scanf("%s", s);      /* to scan in some phrase */ 
    printf("%s", s);      /* to echo it back to me */ 
} 

とLoを見よ、私は別のSegmentation fault (core dumped)を持って!それは "hello"でスキャンすることができましたが、エラーで返答しました。このコードはとても簡単です。ここで私のポインタの使用に何が問題なのですか?

+1

'charが*'文字列、メモリへのポインタだけのためのメモリを割り当てません。 – bejado

+1

アドバイス:先に進む前にCのコンセプトに関する詳細なバックグラウンドを読んでください –

+0

ありがとうございました! @giorgimoniava私は何時間も読んできた、残念ながら、笑!私はしようとしています( –

答えて

0

2番目の例では、実際にはメモリを割り当てません。 char *sポインタcharに割り当てます。あなたは何とかメモリを割り当てる必要があります。

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

int main(int argc, char *argv[]) { 
    char s[100]; 
    printf("Enter the string: "); 
    scanf("%s", s);      /* to scan in some phrase */ 
    printf("%s", s);      /* to echo it back to me */ 
} 

char s[100]は自動的に解放され、スタック上のメモリを宣言します。あなたはヒープ上に割り当てるしたい場合は、malloc/freeを使用します。もちろん

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

int main(int argc, char *argv[]) { 
    char *s = malloc(100 * sizeof(char)); 
    printf("Enter the string: "); 
    scanf("%s", s);      /* to scan in some phrase */ 
    printf("%s", s);      /* to echo it back to me */ 
    free(s); 
} 

これらの単純な例では、あなたの文字列が100文字を超えることはありませんと仮定します。

最初の例も、別の理由で失敗します。

char *x = "hello"; 
    char *y = "world"; 

これらのステートメントは、読み取り専用メモリに文字列を割り当てるため、変更できません。

+0

ありがとうございました!私はmallocを使ってメモリを割り当てるべきだと推測していますか? また、どのように書き込み可能にすることができますか? –

+0

@ KaiC-m 'malloc'を使うか、 'malloc'を使用する場合は、あとでメモリを' free'にしてください! – bejado

0

文字列へのポインタを使用しているときは、常に変更できないことを思い出してください。文字列の文字を変更することはできません。文字列へのポインタでは、文字列は常に読み取り専用メモリに移動します。つまり、メモリは読み取り専用で変更できません。 この文は、セグメントの障害を引き起こしている; -

*x++ = *y++; 

あなたもこれを行うカント; -

int *p="cool"; 
*p="a";   //dereferencing 
printf("%s",p); //segment fault 
関連する問題