在C中自动调整数组长度时出错
我有一个程序来执行一些进程并显示它们的ID: 主要功能:在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)
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总是有一个值,对吗?@thannvDWORD arrProcessID[10];
意味着我们现在有了内存。但是在初始化它或给它一个值之前,我们永远不知道它存储了什么。默认值是未知的。只需使用memset
谢谢您的帮助!
4*10 = 40