何が起こっているかを教えてください:
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;
}
少なくともmallocをキャストしないでください。 – user562374