Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C中自动调整数组长度时出错_C_Windows_Process - Fatal编程技术网

在C中自动调整数组长度时出错

在C中自动调整数组长度时出错,c,windows,process,C,Windows,Process,我有一个程序来执行一些进程并显示它们的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)

我有一个程序来执行一些进程并显示它们的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;
}
但是当我只创建1个进程时,我的数组arrProcessID总是有size=40(总是=sizeof(arrProcessID)*4),而我在arrProcessID[0]中添加了1个值。那么,我的阵列发生了什么

DWORD arrProcessID[10];
请参阅:sizeof(arrProcessID)=40,对吗?(
sizeof(DWORD)=4
See)所以您可以打印40行

for(int i=0; i<sizeof(arrProcessID); i++){
                printf("%d : %lu \n", i, arrProcessID[i]);
            } 
(int i=0;i“sizeof(arrProcessID)”是数组DWORD arrProcessID的总内存大小[10]

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

第6.5.3.4节中的sizeof运算符:

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

在这种情况下,您声明:

DWORD arrProcessID[10];
这是一个由
10
DWORD
组成的数组,每个数组的大小为
4
字节,因此我们有:

4*10 = 40

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

因为您没有将内存重新分配到阵列以供新进程使用。请使用
realloc()
在创建进程之前分配内存。

您将
arrProcessID
声明为
10
DWORD的数组,因此无论存储在数组中的数据是什么,它的大小都将始终相同。请记住
strdup
创建一个由您负责释放的字符串。您必须使用
free(fullCmd)
当您使用完
fullCmd
时,否则您的程序将泄漏内存。但我不明白为什么sizeof(arrProcessID)=40?@Thangnv数组的大小告诉您数组可以容纳多少字节。一个DWORD是4字节,而您有10个DWORD!您可以看到,很抱歉,我理解了数组的大小,但是,您能解释一下为什么数组中的所有项都有值,而我在arrProcessID[0]中添加值吗,我认为默认值是空的,但不是,DWORD总是有一个值,对吗?@thannv
DWORD arrProcessID[10];
意味着我们现在有了内存。但是在初始化它或给它一个值之前,我们永远不知道它存储了什么。默认值是未知的。只需使用
memset
谢谢您的帮助!
4*10 = 40