ポインタと配列の間で混乱しているようです。 (この場合char *
とchar []
で)ポインタと配列が配列char a[SIZE]
not the same thing.
(例えば、a[10]
がどこa
点過去10のエントリである)、この(the FAQから採取した例)のように見えるアレイのように動作するポインタ演算と組み合わせることができます
多くの場合、配列参照が最初の要素へのポインタに「崩壊する」ため、ポインタと配列の違いについて混乱するのは簡単です。これは、多くの場合(関数呼び出しに渡されたときなど)、配列がポインタになることを意味します。詳細を知りたい場合は、this section of the C FAQ describes the differences in detail。
実際の大きな違いの1つは、コンパイラが配列の長さを知っていることです。上記の例の使用:あなたのコードを見ることなく
char a[] = "hello";
char *p = "world";
sizeof(a); // 6 - one byte for each character in the string,
// one for the '\0' terminator
sizeof(p); // whatever the size of the pointer is
// probably 4 or 8 on most machines (depending on whether it's a
// 32 or 64 bit machine)
を、それが最善の行動をお勧めするのは難しいが、私はどこでも、ポインタを使用するように変更すると、あなたが現在抱えている問題を解決すると思います。次の点に注意してください:
以前に使用されていた配列がある場所では、メモリを初期化する必要があります。例えば、char a[10];
はchar *a = malloc(10 * sizeof(char));
になり、その後a != NULL
にチェックされます。 sizeof(char)
は1と定義されているので、実際にはsizeof(char)
と言う必要はありません。完全性のために残しました。
Anywhereの以前に配列の長さのためsizeof(a)
は('\0'
までカウントされ、あなたが文字列を使用している場合、あなたはstrlen()
を使用することができます)あなたが割り当てられたメモリの長さによって交換する必要があります持っていました。
malloc()
への通話ごとに、対応するfree()
を呼び出す必要があります。これは、あなたがmalloc()
で尋ねたメモリを使って完了したことをコンピュータに伝えます。あなたのポインタがa
の場合は、a
が指し示すものが不要であることを知っているコードの一点にfree(a);
と書いてください。
別の答えは、配列の先頭のアドレスを取得したい場合は、あなたが使用することができ、指摘したように:
char* p = &a[0]
char型のポインタp
がアドレスになります」とあなたはこれを読むことができます要素[0]
のa
"となる。
[comp.lang.c FAQ](http://c-faq.com/)のセクション6を読んでください。 –