2011-01-06 6 views
4

我々はC.ポインタの初期化は、疑い

char *c="test";

C点最初の文字(t)に、このような文字ポインタを初期化することができました。

しかし、私は以下のようなコードを与えました。セグメンテーションエラーが発生します。私は

#include<stdio.h> 
#include<stdlib.h> 
main() 
{ 
    int *i; 
    i=(int *)malloc(2); 
    *i=0; 
    printf("%d",*i); 
} 

を与えるとき

#include<stdio.h> 
#include<stdlib.h> 
main() 
{ 

    int *i=0; 
    printf("%d",*i); 
} 

はまた、それは(出力0を与えた)働きました。

私がmalloc(0)を与えたとき、それは働いた(出力0を与えた)。

あなたが行で作成したヌルポインタ参照を解除しようとしているため、フォールトSEGているあなたの最初の例が

+0

少なくともmallocをキャストしないでください。 – user562374

答えて

5

何が起こっているかを教えてください:

int *i=0; 

あなたは、DEことはできません-reference何かを指しておらず、良いことが起こることを期待するポインタ。 =)

2番目のコードセグメントは、mallocを使用して実際にポインタをメモリに割り当てているために機能します。 mallocで割り当てられたアドレスに隣接するメモリに応じて、ゼロ以外の値を取得することは可能でしょう。これは、通常、intが4バイトで、2しか割り当てられていないためです。intポインタの参照を解除すると、指し示されている4バイトに基づいて値がintとして返されます。あなたの場合、最初の2バイトはあなたがmallocから受け取ったものであり、隣接する2バイトはそこにある何でもあり、それが何であってもそれがintであるかのように扱われます。このような奇妙な振る舞いをすることができますし、使用しようとしているタイプに必要なメモリのサイズをmallocする必要があります。
(すなわちint *i = (int *) malloc(sizeof(int));

あなたが正しいサイズであるメモリを指しポインタを持っていたら、次のような値を、その後を設定することができますコメントをもとに

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

int main (int argc, char *argv[]) 
{ 
    int *i = (int *)malloc(sizeof(int)); 
    *i = 25; 
    printf("i = %d\n",*i); 

    *i = 12; 
    printf("i = %d\n",*i); 
    return 0; 
} 

編集:

ポインタは値ではなくメモリを指します。 char *ptr="test"; "test"の値を割り当てていない場合は、プロセスデータセグメントに配置され、読み込み専用である "test"が配置されている場所のメモリアドレスを割り当てます。文字列 "test"を修正しようとしましたが、プログラムはseg-faultになる可能性があります。 char *について理解する必要があるのは、文字列内の単一の(つまり最初の)文字を指していることです。 char *を参照解除すると、1文字と1文字しか表示されません。 Cはヌル終了文字列を使用し、printfを呼び出すときにptrを参照解除しないことに注意してください。ポインタ自体に渡し、最初の文字だけをポイントします。これがどのように表示されるかは、printfに渡されるフォーマットによって異なります。 printfが '%c'形式で渡されると、1文字のptrがポイントします。フォーマット '%p'を渡すと、ptrが指すアドレスが出力されます。文字列全体を取得するには、形式として '%s'を渡します。これがprintfの行うことは、渡したポインタから開始して、ヌルに達するまで連続する各バイトを読み取ることです。以下は、これらを示すコードです。

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

int main (int argc, char *argv[]) 
{ 
    // Initialize to data segement/read only string 
    char *ptr = "test"; 
    printf("ptr points at  = %p\n", ptr); // Prints the address ptr points to 
    printf("ptr dereferenced = %c\n", *ptr); // Prints the value at address ptr 
    printf("ptr value   = %s\n", ptr); // Prints the string of chars pointed to by ptr 

    // Uncomment this to see bad behavior! 
    // ptr[1] = 'E'; // SEG FAULT -> Attempting to modify read-only memory 

    printf("--------------------\n"); 

    // Use memory you have allocated explicitly and can modify 
    ptr = malloc(10); 
    strncpy(ptr, "foo", 10); 
    printf("ptr now points at = %p\n", ptr); // Prints the address ptr points to 
    printf("ptr dereferenced = %c\n", *ptr); // Prints the value at address ptr 
    printf("ptr value   = %s\n", ptr); // Prints the string of chars pointed to by ptr 

    ptr[1] = 'F'; // Change the second char in string to F 
    printf("ptr value (mod) = %s\n", ptr); 
    return 0; 
} 
+0

文字ポインタの初期化は整数ポインタと異なりますか? 'char * ptr =" test "' –

+0

のように初期化できるので、あなたのコメントごとに私の答えを更新しました –

+0

詳細を教えてくれてありがとう。私は1つの質問が残っています。なぜ同じ概念が 'int * i = 12; 'で動作しないのですか?これにより、値の印刷にセグメンテーションフォールトが発生します –

関連する問題