尝试生成多个相同进程时崩溃(访问冲突错误)

Crashes when trying to generate multiples of the same process(Access Violation Error)

因此,当我尝试为同一程序创建多个进程时,我在尝试创建第二个子进程时收到访问冲突错误。 (我能够在尝试创建第二个子进程时崩溃之前创建一个子进程)

int main(int argc, char** argv)
{
    if (argc > 1 && strcmp(argv[1], "lol")) ThreadFunc();

    char key_code;
    int i = 0;

    STARTUPINFO* si = calloc(1, sizeof(STARTUPINFO));
    PROCESS_INFORMATION* pi = calloc(1, sizeof(PROCESS_INFORMATION));

    WCHAR** wideArguments = calloc(1, sizeof(wchar_t*));
    size_t outSize;
    size_t size = strlen(arguments) + 1;

    while (1) {
        if (_kbhit()) {
            key_code = _getch();
            if (key_code == 'c') {
                i += 10;
                si = realloc(si, i * sizeof(STARTUPINFO));
                pi = realloc(pi, i * sizeof(PROCESS_INFORMATION));
                wideArguments = realloc(wideArguments, i * sizeof(wchar_t*));
                for (int k = 0; k < 10; k++) {
                    wideArguments[i + k - 10] = calloc(256, sizeof(wchar_t));
                    GetModuleFileName(NULL, wideArguments[i + k - 10], 256);
                    wcscat_s(wideArguments[i + k - 10], 256, L" lol");
                    int l = CreateProcess(NULL, wideArguments[i + k - 10], NULL, NULL, FALSE, 0, NULL, NULL, &si[i + k - 10], &pi[i + k - 10]);
                    if (l == 0) printf("\n\n%d\n\n", GetLastError());
                }
            }
            else if (key_code == 'x') {
                free(si);
                free(pi);
                for(int j = 0; j < i;j++) free(wideArguments[j];
                free(wideArguments);
                exit(0);        
            }
        }
        else continue;
    }
}

好的,问题是 realloc 没有将内存归零,因此 pi 和 si 中的条目没有被初始化。为了解决这个问题,我们定义了一个 piOriginalsiOriginal 用于稍后初始化数组中的条目。

STARTUPINFO siOriginal = { 0 };
PROCESS_INFORMATION piOriginal = { 0 };

并将 'c' 输入后的循环更改为:

if (key_code == 'c') {
                i += 10;
                si = realloc(si, i * sizeof(STARTUPINFO));
                pi = realloc(pi, i * sizeof(PROCESS_INFORMATION));
                wideArguments = realloc(wideArguments, i * sizeof(wchar_t*));
                for (int k = 0; k < 10; k++) {
                    wideArguments[i + k - 10] = calloc(256, sizeof(wchar_t));
                    si[k + i - 10] = siOriginal;
                    pi[k + i - 10] = piOriginal;
                    GetModuleFileName(NULL, wideArguments[i + k - 10], 256);
                    wcscat_s(wideArguments[i + k - 10], 256, L" lol");
                    int l = CreateProcess(NULL, wideArguments[i + k - 10], NULL, NULL, FALSE, CREATE_NEW_CONSOLE, NULL, NULL, &si[i + k - 10], &pi[i + k - 10]);
                    if (l == 0) printf("\n%d\n", GetLastError());
                }
            }