-1

これは私のコードです:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(){
    char *dd,aaa[500];
    strcpy(aaa,"test 1");
    dd=aaa;
    printf("1. %s\n",dd);
    strcpy(aaa,"test 2");
    printf("2. %s\n",dd);


system("pause");
return 0;
}

文字列ごとにaaa変数を変更した場合、変更もありますが、なぜですか?test 2dd

4

3 に答える 3

2

他の人があなたのコードを見通しに入れるためにあなたがやろうとしていることを言ったら、それは素晴らしいことかもしれません。

今、あなたはポインタがどのように機能するかをよく理解していないようです。あなたのコードは本当に読みやすいものではないので、答えは一般的です。

ポインタはアドレスをメモリに「保持」します。ptr1メモリブロックAを指すポインタと、をptr2指すポインタがある場合ptr1、を変更するとptr1、当然ptr2同じ変更が発生します。someVarコードの最初のブロックでは、変更後に変更される理由を理解していないようですotherVar。@dmpが指摘したことをより明確にするために、でsomeVar保持されている値を指すプログラム(オペレーティングシステムがプログラムのメモリを管理している)を指定しましたotherVar[0]。これで、otherVar[0]変更すると、someVarポインタが機能することになっているため、変更されます。ポインタが指すものの値を要求すると、ポインタを逆参照するように呼び出されます。ptr2。ですから、ポインタについてもう一度お読みください。

コードの2番目のブロックでは、何を達成しようとしているのかわかりませんが、それが何であれ、実行されますSEGFAULT。これも、ポインタ、配列の関係、および動的メモリ割り当てがどのように機能するかを理解していないためです。たとえば、splittext関数には次の行があります。

wchar_t *arr[2],*loc = wcsstr(stri, del), buf[DEFAULT_BUFLEN];

すぐそこに:*arrメモリを割り当てていないときに、の3番目のセルの値を確認するようにオペレーティングシステムに指示します。また、メモリを割り当てるときは、次の点に注意してください。

  1. 文字列を取得するためにメモリを割り当てたい場合char、ポインタは次のcharようなポインタである必要があります。

char* my_string = malloc( 256*sizeof(char))

次に、タイプの変数へのポインタに割り当てられたメモリを取得しますFILE*。あなたが書くならば、FILE** my_files = malloc( NUMBER_OF_FILES*sizeof(FILE))それはあなたを困らせるでしょう。むしろ書く:

FILE** my_files = malloc( NUMBER_OF_FILES*sizeof(FILE*))

これは、たとえばメモリをどのように割り当てたかに関するものですarr

  1. また、の戻り値をキャストしないでmallocください。コンパイラがキャッチした可能性のある多くのエラーを非表示にします。

要約すると、ポインタ、配列、およびメモリ割り当ての少し高度な使用法に進む前に、まずポインタについて学習してみてください。次に、間違ったコードを入れて(コンパイルされないか、クラッシュするだけで間違っていることがわかります)、他の人に「その変数を見てください。私の問題があります」と言うことはできません。質問についてさらに調査を行い、どのツールが役立つか(この場合はデバッガー)を学習してみてください。これにより、質問の品質が向上します。最後に、英語があなたの第一言語でない場合、あなたはそれについて言及することができ、他の人はあなたの質問を再定式化するのを喜んで手伝ってくれるでしょう。

次回はもっと上手くいくことを願っています!

アップデート

OPによる編集後、質問はより明確になり、OPの問題はポインターに関するものになりました。

ddの値は次の理由で変化します:

aaaは次のようなポインタです:char aaa[500]と同等char* aaa = malloc(500*sizeof(char))です。ここで、と同じメモリアドレスを指すようdd=aaaにコンパイラに指示しました。したがって、変更するたびに、メモリ内の同じものを指しているため、変更されます。ddaaaaaa dd

それが明確でない場合は、ポインターの定義を読み直してみてください。

于 2012-09-09T18:32:08.990 に答える
0

質問する内容は明確ではありませんが、Cのポインターは値で渡されます(同じ場所を指すポインターのコピーがあります)。ポインターを逆参照して、ポイントされた値を変更すると、呼び出し元に変更が表示されます。

于 2012-09-09T12:40:41.880 に答える
0

クイックポインタレッスンはそれをクリアする必要があります:

この行で何が起こりますか?char * dd = aaa;

ddという文字割り当てへのポインタを作成し、それをaaaが格納されているメモリアドレスにポイントしました。

aaaのアドレスはスタック上にあり、静的です(aaa [500]を使用して暗黙的に作成しました)。

これで、データをaaaに入れると、メモリ内のaaaの位置は変更されず、単にメモリ内のその位置に格納されたデータになります。aaaの「コンテンツ」を印刷しようとすると、その時点でメモリに文字が格納されます。新しいデータをaaaにコピーしても、メモリ内の位置は同じままであるため、ddはaaaと同じメモリスペースを指しています。

それが他の誰よりも明確でない場合は、お詫び申し上げます...

于 2012-09-10T00:24:21.197 に答える