1

いくつかのプロセスを実行し、それらの ID を表示するプログラムがあります。

主な機能:

int main(void){
char code[25];
bool testCmd = false;
DWORD arrProcessID[10];
char *fullCmd;
char *parameter;
char *command;
char *extraCmd;
int loop = 1;
while (loop == 1){
    printf("C:\\>");
    scanf("%[^\n]",code);
    fullCmd = strdup(code);
    command = strtok(fullCmd, " ");
    extraCmd = strtok(NULL, " ");
    parameter = strtok(NULL, " ");

    if ((strcmp(command, "list") == 0) || (strcmp(command, "LIST") == 0)){
        if (extraCmd != 0){
            printf("%s is not recognized as an internal or external command, operable program or batch file. \n", code);
        } else {
            printf("ID process is running: \n");
            printf("%d \n",sizeof(arrProcessID));
            for(int i=0; i<sizeof(arrProcessID); i++){
                printf("%d : %lu \n", i, arrProcessID[i]);
            } 
        }
    }

    if ((strcmp(command, "install") == 0) || (strcmp(command, "INSTALL") == 0)){
        if (extraCmd == 0){
            printf("%s is not recognized as an internal or external command, operable program or batch file. \n", code);
        } else {
            if  ((strcmp(parameter, "-b") == 0) || (strcmp(parameter, "-B") == 0)){
                PROCESS_INFORMATION pi = createBackgroundProcess(extraCmd, parameter);
                arrProcessID[0] = pi.dwProcessId;
                printf("%d \n",sizeof(arrProcessID));
                printf("%lu \n",arrProcessID[0]);
            }
        }
    }

if(strcmp(command,"exit") == 0 || strcmp(command, "quit") == 0){
        loop = 0;
        printf("Program Terminated\n");
    }
    while(getchar() != '\n');
}
return 0;
}

そして、これはプロセスを作成するための私の関数です:

PROCESS_INFORMATION createBackgroundProcess(char *exeFileName, char *parameter){
STARTUPINFO si;
PROCESS_INFORMATION pi;
ZeroMemory(&si, sizeof(si));
si.cb = sizeof(si);
CreateProcess(exeFileName,NULL,NULL,NULL,FALSE,
CREATE_NO_WINDOW,NULL,NULL,&si,&pi);
TerminateProcess(pi.hProcess, 0);
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
return pi;
}

しかし、プロセスを 1 つだけ作成すると、配列 arrProcessID のサイズは常に 40 (常に = sizeof(arrProcessID) * 4) になり、arrProcessID[0] に 1 つの値が追加されます。それで、私の配列はどうなりましたか?

4

4 に答える 4

1
DWORD arrProcessID[10];

参照: sizeof(arrProcessID) = 40 ですね。(ここsizeof(DWORD) = 4を参照)したがって、40行を印刷します。

for(int i=0; i<sizeof(arrProcessID); i++){
                printf("%d : %lu \n", i, arrProcessID[i]);
            } 

ループi <sizeof(arrProcessID)/sizeof(arrProcessId[0])の代わりに使用します。i< sizeof(arrProcessID)

そして、何を1行しか印刷しない場合(プロセスが1つしかない場合)、次の手順を実行できます。

  1. 配列を初期化するために使用memset(arrProcessID,0,sizeof(arrProcessID)); します(現在はすべてNULL)。

  2. ループi <sizeof(arrProcessID)/sizeof(arrProcessId[0]) && arrProcessID[0]!= NULLの代わりに使用します。i< sizeof(arrProcessID)

于 2013-08-06T02:30:53.310 に答える
1

「sizeof(arrProcessID)」は、配列 DWORD arrProcessID[10] の合計メモリ サイズです。

配列の要素数を知りたい場合は、「sizeof(arrProcessID) / sizeof(arrProcessID[0])」を使用します。

于 2013-08-06T02:34:25.807 に答える
1

C99 draft standardセクションから6.5.3.4 The sizeof operator

配列型のオペランドに適用すると、結果は配列内の合計バイト数になります

この場合、次のように宣言します。

DWORD arrProcessID[10];

これは10 DWORDs の配列で、それぞれの4サイズはバイトであるため、次のようになります。

4*10 = 40

これは、配列に実際に格納されているデータには関係ありません。

于 2013-08-06T02:42:34.920 に答える
0

新しいプロセスが使用するためにメモリを配列に再割り当てしなかったためです。realloc()プロセスを作成する前にメモリ割り当てを使用します。

于 2013-08-06T02:55:17.493 に答える