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 总是有 size = 40(总是 = sizeof(arrProcessID) * 4),而我在 arrProcessID[0] 中添加了 1 个值。那么,我的数组发生了什么?

4

4 回答 4

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 回答
1

“sizeof(arrProcessID)”是数组 DWORD arrProcessID[10] 的总内存大小。

如果您想知道数组项的数量,请使用“sizeof(arrProcessID) / sizeof(arrProcessID[0])”。

于 2013-08-06T02:34:25.807 回答
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. 用于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 回答
0

因为您没有将内存重新分配给数组以供新进程使用。在创建进程之前使用realloc()分配内存。

于 2013-08-06T02:55:17.493 回答