Cで新しいchar配列を記述して初期化した後、変数が変更されます

フランコ
  • でプログラムを実行するとchar filePath[100]="/home/wind/software/eclipse/eclipse2/server_multiaccess/wrPro3"通信に使用する子ソケットのソケット番号が急に変わってしまいます。なぜだろうか。
  • 結果は写真のようになります:gdbでwatchを使用した結果

  • sockMは私が自分で定義した構造体リストの先頭です。子構造体を構造体リストに入れようとしています。


struct Sock{
    int socket;
    short int ifMain;
    short int status;
    FILE* fp;    // Cannot be initialized here
    long int filePoint;
    char recvBuf[BUFSZ];
    char sendBuf[BUFSZ];
    char command[BUFSZ];
    unsigned long int answer;
};
struct sockListEle{
    struct Sock sock;
    struct sockListEle* last;
    struct sockListEle* next;
    struct sockListEle* head; 
    struct sockListEle* end;
    int sockNum;
};

int main(void) {
    int mainS,childS;
    struct sockaddr_in mainSock;
    int on;
    .....
    .....
    while(1){
        FD_SET(mainS,&mainRead);
        select(mainS+1,&mainRead,NULL,NULL,&timeout);
        if(FD_ISSET(mainS,&mainRead)){
            struct sockaddr_in childSock;
            .....
            struct sockListEle sockC;

            sockC.sock.ifMain=0;
            ......
            sockC.next = NULL;

            sockM.end = &sockC;
            sockM.sockNum++;
            sockC.last->next = &sockC;

            maxfdp = maxfdp > childS ? maxfdp:childS+1;
    }
    .....
    .....
    if(maxfdp > 0){
        .....
        temp = &sockM;
        do{
            temp = temp->next;
            switch(temp->sock.status){
                ....
                case LOOKFOR:
                    if(FD_ISSET(temp->sock.socket,&writeList)){
                        send(temp->sock.socket, temp->sock.sendBuf, BUFSZ, 0);
                        if(!strcmp(temp->sock.command+4, "ls")){
                            char filePath[100] =
                                "/home/wind/software/eclipse/"
                                "eclipse2/server_multiaccess/wrPro3";
                            ......
                    }
                    break;
                    ......
             }
        }while(temp->next != NULL)
     }
     return EXIT_SUCCESS;
 }
アコンカグア

問題は次の3行です。

struct sockListEle sockC;
sockM.end = &sockC;
sockC.last->next = &sockC;

それらは、同じif内で、同じwhile内で3つすべてに見つかります。つまり、sockCはスタックに配置され、各ループ内で再利用されるため、エンドポイントのリスト内のすべての要素は常に1つの同じsockCを指します。そして、それを変更する場合(おそらくacceptを呼び出すことによって)、すべてのリスト要素に対して表示される唯一のインスタンスを変更します。

代わりに、ソケットごとに個別のメモリを割り当てる必要があります。

struct sockListEle* sockC = (struct sockListEle*) malloc(sizeof(struct sockListEle));

ポインタを直接割り当てます(演算子&のアドレスなし)。必要がなくなったらすぐにメモリを解放することを忘れないでください。そうしないと、メモリリークが発生します。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

各反復で「my」を使用して新しい変数を作成したにもかかわらず、「結合または文字列の配列内で初期化されていない値を使用する」エラーが発生する

分類Dev

TypeScript:初期化されたObservable変数に新しいObservableを割り当てます

分類Dev

変数が初期化された後でも、テンソルフローは初期化されていないエラーをスローします

分類Dev

配列からキーを使用して変更されたオブジェクトを返すtypescript関数を記述します

分類Dev

新しいDataFrameを別のDataFrameから初期化するときにdtypesが変更されました

分類Dev

「値は使用されませんでした」は「変数が初期化されていません」に変更されます

分類Dev

「値は使用されませんでした」は「変数が初期化されていません」に変更されます

分類Dev

numpy配列がC関数で変更されているときに魔法が発生しています

分類Dev

すでに初期化されている変数のクラスを変更します

分類Dev

型がJavaですでに定義された後、同時に複数の変数を初期化しますか?

分類Dev

C#では、配列のサイズを変更する(この場合はサイズを大きくする)と、新しいセグメントがデフォルト値で初期化されます。これは信頼できますか?

分類Dev

TensorFlow:変数の初期化で「初期化されていない値を使用しようとしています」

分類Dev

オブジェクトの新しい配列ですが、キーが変更されています

分類Dev

変数を使用してyamlで記述されたPythonスクリプトを実行します

分類Dev

Pythonで初期化された変数を確認します

分類Dev

記述関数を変更して、列を削除および追加します

分類Dev

char []とcharを初期化した後のC ++、charはchar []に表示されます

分類Dev

Swiftで遅延初期化された変数を再初期化します

分類Dev

Cのすべての変数を1行で初期化し、初期化されていない値

分類Dev

Java変数は変更されていません、参照した後でも変更されました

分類Dev

C構造体で行列変数を初期化しています

分類Dev

PHP静的変数が宣言または初期化されているかどうかを確認しますか?

分類Dev

VB.NETで記述されたLINQをC#に変換します

分類Dev

初期化されていない配列変数はどうなりましたか?

分類Dev

c ++の質問:変数に値を割り当てた後、他の変数が変更されました

分類Dev

変数を初期化し、forループで値を変更した後にアクセスします

分類Dev

小道具として初期化された変数が変更されると、Reactの小道具が予期せず変更されます

分類Dev

Lateinit変数が初期化されていませんが、初期化されました(Android)

分類Dev

メイン配列の変更されたプロパティの新しい配列を作成します

Related 関連記事

  1. 1

    各反復で「my」を使用して新しい変数を作成したにもかかわらず、「結合または文字列の配列内で初期化されていない値を使用する」エラーが発生する

  2. 2

    TypeScript:初期化されたObservable変数に新しいObservableを割り当てます

  3. 3

    変数が初期化された後でも、テンソルフローは初期化されていないエラーをスローします

  4. 4

    配列からキーを使用して変更されたオブジェクトを返すtypescript関数を記述します

  5. 5

    新しいDataFrameを別のDataFrameから初期化するときにdtypesが変更されました

  6. 6

    「値は使用されませんでした」は「変数が初期化されていません」に変更されます

  7. 7

    「値は使用されませんでした」は「変数が初期化されていません」に変更されます

  8. 8

    numpy配列がC関数で変更されているときに魔法が発生しています

  9. 9

    すでに初期化されている変数のクラスを変更します

  10. 10

    型がJavaですでに定義された後、同時に複数の変数を初期化しますか?

  11. 11

    C#では、配列のサイズを変更する(この場合はサイズを大きくする)と、新しいセグメントがデフォルト値で初期化されます。これは信頼できますか?

  12. 12

    TensorFlow:変数の初期化で「初期化されていない値を使用しようとしています」

  13. 13

    オブジェクトの新しい配列ですが、キーが変更されています

  14. 14

    変数を使用してyamlで記述されたPythonスクリプトを実行します

  15. 15

    Pythonで初期化された変数を確認します

  16. 16

    記述関数を変更して、列を削除および追加します

  17. 17

    char []とcharを初期化した後のC ++、charはchar []に表示されます

  18. 18

    Swiftで遅延初期化された変数を再初期化します

  19. 19

    Cのすべての変数を1行で初期化し、初期化されていない値

  20. 20

    Java変数は変更されていません、参照した後でも変更されました

  21. 21

    C構造体で行列変数を初期化しています

  22. 22

    PHP静的変数が宣言または初期化されているかどうかを確認しますか?

  23. 23

    VB.NETで記述されたLINQをC#に変換します

  24. 24

    初期化されていない配列変数はどうなりましたか?

  25. 25

    c ++の質問:変数に値を割り当てた後、他の変数が変更されました

  26. 26

    変数を初期化し、forループで値を変更した後にアクセスします

  27. 27

    小道具として初期化された変数が変更されると、Reactの小道具が予期せず変更されます

  28. 28

    Lateinit変数が初期化されていませんが、初期化されました(Android)

  29. 29

    メイン配列の変更されたプロパティの新しい配列を作成します

ホットタグ

アーカイブ