简单分配中的分段错误(核心转储)

时间:2013-07-17 20:18:56

标签: c malloc typedef freebsd

我正在使用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....
}

这是我想出的代码片段负责错误,但我不明白为什么。我尝试根据需要为双空格分配mem,但我仍然遇到错误。因为我分配了100个元素,它似乎已经足够......我没有再出现错误了。 ClientThreadArg_t的大小与建议的36一样,循环只运行1次。那么,我在为这个结构分配内存的方式上做错了什么?

1 个答案:

答案 0 :(得分:8)

我无法判断何时无法运行您的代码,但从它的外观来看,它可能就在这里

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

请注意,THREADAMOUNT定义为CPUCORES - 1 2 - 1

这意味着你会得到

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

因此你可能会使用一个负数来进行mallocing,这将返回null