1
  1. main()から約1000回呼び出されるこの関数があります。この関数でmalloc()を使用してポインターを初期化すると、セグメンテーション違反が発生します。これは、関数を終了する前にポインターをfree()しなかったことが原因である可能性があります。ここで、mainに戻る前にポインタをfree()しようとしましたが、役に立たず、最終的にセグメンテーション違反が発生します。
    1. 上記のシナリオは1つですが、ダブルポインター(** ptr)とポインターの配列へのポインター(* ptr [])を初期化するにはどうすればよいですか?
    2. 文字列(char配列)をcharポインタの配列にコピーする方法はありますか?char arr []; (そのような配列が50個あるとしましょう)char * ptr_arr [50]; ここで、そのような各chararr[]を*ptr_arr[]にポイントします。ここでchar*ptr_arr []を初期化するにはどうすればよいですか?
    3. Cの初期化されていないポインタの影響は何ですか?
    4. strcpy()はそれ自体で「\ 0」を追加しますか、それとも手動で追加する必要がありますか?strncpy()と比較してstrcpy()はどのくらい安全ですか?strcat()やstrncat()と同じように。

ありがとう。

4

6 に答える 6

4
  1. セグメンテーション違反は多くの原因で発生する可能性があります。mallocの後にポインタをチェックしますか(NULLの場合)?コードの行をステップスルーして、それがどこで発生するかを正確に確認します(そして、詳細とコードについて別の質問をします)

  2. Cでのポインタと配列の関係を理解し​​ていないようです。まず、ポインタの配列へのポインタは、type***またはtype**[]のように定義されます。実際には、2回間接化されたポインタのみが有用です。それでも、このようなものを使用できます。ポインタを十分な回数間接参照して、実際のメモリ割り当てを実行するだけです。

  3. これは厄介です。別の質問にする必要があります。

  4. 彼らはおそらくあなたのプログラムをクラッシュさせます、しかしこれは未定義なので、あなたは確信が持てません。それらはすでに使用されているメモリ「スロット」のアドレスを持っている可能性があるため、気付かないバグがある可能性があります。

于 2009-09-25T17:57:45.090 に答える
1

あなたの質問から、私のアドバイスは「Cのポインター」をグーグルで検索し、いくつかのチュートリアルを読んで、ポインターとは何か、そしてそれらの使用方法を理解することです-あなたを立ち上げるためにSOの答えで繰り返す必要があることがたくさんありますスピードを上げる。

上位2つのヒットはここここにあります。

于 2009-09-25T17:53:30.840 に答える
1

いくつかのコードを見ずに最初の質問に答えるのは難しいです-セグメンテーション違反は追跡するのが難しいので、コードを見るのはもっと簡単です。

ダブルポインタは、その背後にある概念が同じであるため、シングルポインタよりも特別なものではありません。例えば...

char * c = malloc(4);
char **c = &c;

c)が何を求めているのかはよくわかりませんが、最後の質問に答えるために、初期化されていないポインタはCで未定義のアクションを持っています。起こっている特定の結果に頼るべきではありません。

編集:私が答えたのであなたは質問を追加したようです...

strcpy(..)は、実際にソース文字列のnullターミネータをデスティネーション文字列にコピーします。

于 2009-09-25T17:54:27.360 に答える
1

ポインタは、別の変数のアドレスまたは場所を保持する特殊なタイプの変数です。ポインタは、それらが保存された場所の記録を保持することによって、これらの場所を指し示します。変数へのポインタは、変数が格納されているアドレスを記録することによって検出されます。特殊な&演算子を使用して、Cのストレージのアドレスを常に見つけることができます。たとえばlocation、float型変数の場合、それへのポインタを見つけるのは簡単です。location_ptr

float location;
float *location_ptr,*address;

location_ptr = &(location);

また

 address = &(location);

ポインタの宣言は、最初は少し奇妙に見えます。変数名の前にあるスター*記号は、その変数をポインターとして宣言するCの方法です。上記の4行は、locationと呼ばれる浮動小数点変数への2つの同一のポインターを作成します。location_ptr一方はと呼ばれ、もう一方はと呼ばれaddressます。重要なのは、ポインタは変数のアドレスの記録を保持するための単なる場所であるため、実際には同じものであるということです。

ポインタは、2つの部分からなる情報のバンドルです。1つの部分は、ポイントされたものを保持するメモリのセグメントの先頭のアドレスです。もう1つの部分は、ポインターが先頭を指す値のタイプです。これは、読み取りを開始した後のメモリの量とその解釈方法をコンピュータに通知します。したがって、ポインタがint型の場合、返されるメモリのセグメントは4バイト長(32ビット)であり、整数として解釈されます。関数の場合、typeは関数が返す値のタイプですが、アドレスは関数の実行可能ファイルの先頭のアドレスです。

また、http://www.jnucode.blogspot.comでC /C++プログラミングに関するチュートリアルを入手してください。

于 2011-06-12T14:24:20.907 に答える
1

パート'a'の場合、これはおそらく役立ちます:

void myfunction(void) {
  int * p = (int *) malloc (sizeof(int));
  free(p);
}

int main () {
  int i;
  for (i = 0; i < 1000; i++)
    myfunction();

  return 0;
}

これがスタンフォードからのポインタの素晴らしい紹介です

于 2009-09-25T17:57:06.493 に答える
0

strcpy/strncpyに関する質問を追加しました。

strcpyの方が実際には安全です。ヌル終了文字列をコピーし、コピーにヌルターミネータを追加します。つまり、元の文字列の正確な複製を取得します。

一方、strncpyには2つの異なる動作があります。

  • ソース文字列の長さが「n」文字未満の場合、strcpyと同じように機能し、コピーを終了します。
  • ソース文字列の長さが「n」文字以上の場合、「n」に達するとコピーを停止し、文字列を終了しないままにします。したがって、結果の文字列がまだ有効であることを確認するために、結果の文字列を常にnul-terminateする必要があります。
    char dest [123];
    strncpy(dest、source、123);
    dest [122] ='\ 0';
于 2009-09-25T18:11:23.690 に答える