如何在我的 C 程序中正确分配内存?
How do I properly allocate memory in my C program?
我正在用 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->val1;
行。 pdataArray
是在结构中定义的 MyData
的数组,每个元素都传递到线程中。
我是不是没有为数组正确分配内存?如果不是,我将如何访问作为参数传递给 SomeFunction()
的结构的成员?我已经检查了我的代码几次,但没有发现我所知道的任何错误。我在 MSDN 上遵循的示例是 here.
在 MyFunction
中,PMYDATA pDataArray;
不会神奇地等于 main
中的 pDataArray
。这是一个未初始化的指针,pDataArray->val1;
尝试写入随机内存位置。
提示:您还有一个 LPVOID lparam
被您忽略了。
我正在用 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->val1;
行。 pdataArray
是在结构中定义的 MyData
的数组,每个元素都传递到线程中。
我是不是没有为数组正确分配内存?如果不是,我将如何访问作为参数传递给 SomeFunction()
的结构的成员?我已经检查了我的代码几次,但没有发现我所知道的任何错误。我在 MSDN 上遵循的示例是 here.
在 MyFunction
中,PMYDATA pDataArray;
不会神奇地等于 main
中的 pDataArray
。这是一个未初始化的指针,pDataArray->val1;
尝试写入随机内存位置。
提示:您还有一个 LPVOID lparam
被您忽略了。