【问题标题】:Error auto resize length of array in C错误自动调整C中数组的长度
【发布时间】:2013-08-06 21:50:24
【问题描述】:

我有一个程序来执行一些进程并显示它们的 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 个值。那么,我的数组发生了什么?

【问题讨论】:

  • 您将arrProcessID 声明为10 DWORD 数组,因此无论您存储在数组中的数据如何,它都将始终具有相同的大小。
  • 请记住,strdup 创建一个字符串您负责释放。使用完fullCmd 后必须使用free(fullCmd);,否则程序会泄漏内存。

标签: c windows process


【解决方案1】:
DWORD arrProcessID[10];

请参阅:sizeof(arrProcessID) = 40,对吗? (sizeof(DWORD) = 4见here)所以你打印40行。

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

在循环中使用i &lt;sizeof(arrProcessID)/sizeof(arrProcessId[0]) 而不是i&lt; sizeof(arrProcessID)。

如果您只打印 1 行(如果您只有一个进程)。您可以执行以下步骤:

  1. 使用memset(arrProcessID,0,sizeof(arrProcessID)); 初始化数组。(现在全部为NULL)。

  2. 在循环中使用 i &lt;sizeof(arrProcessID)/sizeof(arrProcessId[0]) &amp;&amp; arrProcessID[0]!= NULL 而不是 i&lt; sizeof(arrProcessID)。

【讨论】:

  • 但我不明白为什么 sizeof(arrProcessID) = 40 ?
  • @Thangnv sizeof 为您提供数组包含的字节数。一个 DWORD 是 4 个字节,你有 10 个 DWORD!可以看msdn.microsoft.com/en-us/library/cc230318.aspx
  • 对不起,我了解我的数组的大小,但是,你能解释一下为什么我的数组中的所有项目都有值,而我直到在 arrProcessID[0] 中添加值,我认为默认值为 NULL,但是不,DWORD 总是有值的,对吧?
  • @Thangnv DWORD arrProcessID[10]; 表示我们现在有了内存。但是在初始化它或给它一个值之前,我们永远不知道其中存储了什么。它的默认值是未知的。只需使用memset
  • 感谢您的帮助!
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    来自C99 draft standard 部分6.5.3.4 The sizeof operator:

    当应用于具有数组类型的操作数时,结果是数组中的总字节数

    在这种情况下,您声明:

    DWORD arrProcessID[10];
    

    这是一个10DWORDs 的数组,每个数组的大小都是4 字节,所以我们有:

    4*10 = 40
    

    这与实际存储在数组中的数据无关。

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-10-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多