2

我正在使用 c 并在 freeBSD 系统上编写此代码。

///// defines /////

#define CPUCORES                2
#define THREADAMOUNT            CPUCORES - 1
#define nullptr                 NULL

///// typedefs /////

typedef enum BOOL_e
{
    e_FALSE = 0,
    e_TRUE = 1
}BOOL_t;

typedef struct NewClient_s
{
int sdNewClient;
struct sockaddr sdinClientIp;
socklen_t sdlenIPsize;
}NewClient_t;

typedef struct ClientThreadArg_s
{
    int iInternID;
    NewClient_t sIncommingClient;
    BOOL_t bHasKillSig;
    BOOL_t bIsShutdown;
}ClientThreadArg_t;

//------------------------------------ imagin this is the main

    ClientThreadArg_t *spListOfArguments;
    size_t sizeIndexI;
    spListOfArguments = (ClientThreadArg_t *) malloc (THREADAMOUNT * sizeof     (ClientThreadArg_t));   



for (sizeIndexI = 0; sizeIndexI < THREADAMOUNT; sizeIndexI++)
{   
    spListOfArguments[sizeIndexI].bHasKillSig = e_TRUE;//Heres the error....
}

这是我发现导致错误的代码片段,但我不明白为什么。我尝试根据需要为双倍空间分配内存,但仍然出现错误。当我分配了 100 个元素时,它似乎就足够了......我不再有错误了。ClientThreadArg_t 的 sizeof 建议为 36,循环只运行 1 次。那么,我在为该结构分配内存的方式上做错了什么?

4

1 回答 1

8

很难说我什么时候不能运行你的代码,但从它的外观来看,它可能就在这里

 spListOfArguments = malloc (THREADAMOUNT * sizeof(ClientThreadArg_t)); 

请注意,THREADAMOUNT 定义CPUCORES - 12 - 1

这意味着你会得到

 spListOfArguments = malloc (2 - 1 * sizeof(ClientThreadArg_t)); 

因此您将分配一个负数,该负数将返回 null

于 2013-07-17T20:38:20.327 回答