【问题标题】:How do I properly allocate memory in my C program?如何在我的 C 程序中正确分配内存?
【发布时间】:2015-10-21 10:00:24
【问题描述】:

我正在用 C 语言编写一个 Windows 程序来完成家庭作业,但我遇到了一个问题,导致我的程序因 program.exe 停止工作而崩溃。我认为这是由于内存分配不正确。

该程序应该启动多个线程来执行任务,我在 MSDN 上找到了一个关于创建线程的示例。我已将部分代码添加到我的程序中。

我的程序:

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <Windows.h>

#define MAX_THREADS 4
#define BUFFER_SIZE 65000

DWORD WINAPI SomeFunction( LPVOID lpParam );

char fileBuffer[BUFFER_SIZE];

typedef struct MyData {
    int val1;
    int val2;
} MYDATA, *PMYDATA;

int main(int argc, char *argv[])
{
    int i = 0;
    int j = 0;
    PMYDATA pDataArray[MAX_THREADS];
    DWORD   dwThreadIdArray[MAX_THREADS];
    HANDLE  hThreadArray[MAX_THREADS]; 


        for (i; i < MAX_THREADS; i++)
        {
            pDataArray[i] = (PMYDATA) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,
                    sizeof(MYDATA));

            if( pDataArray[i] == NULL )
            {
               // If the array allocation fails, the system is out of memory
               // so there is no point in trying to print an error message.
               // Just terminate execution.
                ExitProcess(2);
            }

            // Create the thread to begin execution on its own.
            hThreadArray[i] = CreateThread(NULL, 0, SomeFunction, pDataArray[i], 0, &dwThreadIdArray[i]);

            if (hThreadArray[i] == NULL)
            {
                printf("%s\n", "Error creating thread!");
                ExitProcess(3);
            }

        }

        for (j; j < MAX_THREADS; j++)
        {
            printf("%s%d\n", "j=", j);
            WaitForSingleObject(hThreadArray[j], INFINITE);
        }

        //WaitForMultipleObjects(MAX_THREADS, hThreadArray, TRUE, INFINITE);
        i = 0;
        for(i; i<MAX_THREADS; i++)
        {
            CloseHandle(hThreadArray[i]);
            if(pDataArray[i] != NULL)
            {
                HeapFree(GetProcessHeap(), 0, pDataArray[i]);
                pDataArray[i] = NULL;    // Ensure address is not reused.
            }
        }

        printf("%s\n", "DONE!");

        return 0;

}

DWORD WINAPI SomeFunction( LPVOID lpParam)
{
    PMYDATA pDataArray;
    int anotherInt;

    anotherInt = pDataArray->val1; // PROBLEM OCCURS HERE!

    printf("%s%d\n", "Printing int ", anotherInt);


    return 0;
}

上面的程序应该能够启动多个执行SomeFunction()的线程。我已经隔离了这个函数的错误,特别是 anotherInt = pDataArray-&gt;val1; 行。 pdataArray 是在结构中定义的 MyData 的数组,每个元素都被传递到一个线程中。

我没有为数组正确分配内存吗?如果不是,我将如何访问作为参数传入SomeFunction() 的结构的成员?我已经检查了我的代码几次,找不到任何我知道的错误。我在 MSDN 上遵循的示例是 here

【问题讨论】:

  • 您的内存分配看似正确但效率低下。你正在分配MAX_THREADSsizeof(MYDATA)。您同样可以分配sizeof(MYDATA) * MAX_THREADS

标签: c multithreading memory allocation


【解决方案1】:

MyFunction 中,PMYDATA pDataArray; 不会神奇地等于main 中的pDataArray。这是一个未初始化的指针,pDataArray-&gt;val1; 尝试写入随机内存位置。

提示:您也有一个 LPVOID lparam 被忽略。

【讨论】:

  • 谢谢,我已将lparam 分配给pDataArray 并且能够访问val1!。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-28
  • 1970-01-01
  • 1970-01-01
  • 2010-09-27
相关资源
最近更新 更多