我正在使用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次。那么,我在为这个结构分配内存的方式上做错了什么?
答案 0 :(得分:8)
我无法判断何时无法运行您的代码,但从它的外观来看,它可能就在这里
spListOfArguments = malloc (THREADAMOUNT * sizeof(ClientThreadArg_t));
请注意,THREADAMOUNT定义为CPUCORES - 1
2 - 1
这意味着你会得到
spListOfArguments = malloc (2 - 1 * sizeof(ClientThreadArg_t));
因此你可能会使用一个负数来进行mallocing,这将返回null