C分配内存

时间:2013-10-12 13:40:45

标签: c malloc

我是C的初学者,我遇到了一个错误,在某些时候,代码会在运行时停止应用程序。

int l = 0;
//block 1
char *primaryIPaddr;
unsigned char *primaryIPaddrSize;
primaryIPaddrSize = *(unsigned char *) &msg[l++];
AddToLog(logInfo, "PrimarySize: %u\n", primaryIPaddrSize);
if(primaryIPaddrSize != NULL) {
  memcpy ( primaryIPaddr, &msg[l], primaryIPaddrSize );
  AddToLog(logInfo, "PrimaryAddr: %s\n", primaryIPaddr);
  l += primaryIPaddrSize;
}
//block 2
char *secondaryIPaddr;
unsigned char *secondaryIPaddrSize;
secondaryIPaddrSize = *(unsigned char *) &msg[l++];
AddToLog(logInfo, "secondarySize: %u\n", secondaryIPaddrSize);
if(secondaryIPaddrSize != NULL) {
  memcpy ( secondaryIPaddr, &msg[l], secondaryIPaddrSize );
  AddToLog(logInfo, "secondaryAddr: %s\n", secondaryIPaddr);
  l += secondaryIPaddrSize;
}
//block 3
unsigned int *primaryPort;
unsigned int *secondaryPort;
primaryPort = *(unsigned int *) &msg[l++];
AddToLog(logInfo, "primaryPort: %u\n", primaryPort);
secondaryPort = *(unsigned int *) &msg[l++];
AddToLog(logInfo, "secondaryPort: %u\n", secondaryPort);`

msg变量是一个由UDP数据包填充的字符,我不知道我的代码有什么问题,但是当进程到达块2时它就停止了,听起来像是内存问题,因为我删除了块如图1所示,并且将l变量推进到块2的精确点,块2正确地处理和转储,就像块2停止处理之前的块1一样。所以代码本身没关系,似乎我没有正确分配内存,我试图使用malloc,但没有做任何影响所以,我不知道我做得对不对,有人知道答案这可能会发生什么?

UDP数据包就是这样的:

UINT8 primaryIPaddrSize;
UINT8* primaryIPaddr; primaryIPaddrSize bytes
UINT8 secondaryIPaddrSize;
UINT8* secondaryIPaddr; secondaryIPaddrSize bytes
UINT16 primaryIPport;
UINT16 secondaryIPport`

secondaryIp是可选的,所以如果secondaryIPaddrSize为null,那么我必须跳过secondaryIPaddr。

1 个答案:

答案 0 :(得分:2)

你的'阻止1'有几个问题。您需要打开编译器警告,或注意它给你的那些警告。

char *primaryIPaddr;
unsigned char *primaryIPaddrSize;
primaryIPaddrSize = *(unsigned char *) &msg[l++];
AddToLog(logInfo, "PrimarySize: %u\n", primaryIPaddrSize);
if (primaryIPaddrSize != NULL) {
    memcpy(primaryIPaddr, &msg[l], primaryIPaddrSize );
    AddToLog(logInfo, "PrimaryAddr: %s\n", primaryIPaddr);
    l += primaryIPaddrSize;
}

您的'primaryIPaddrSize'是char *(地址),但在memcpy()中,您将其用作长度。 primaryIPaddrSize的任务很奇怪;您应该收到有关为指针分配char的警告。鉴于赋值,memcpy()长度为'OK',但这很奇怪。你应该写:

unsigned char primaryIPaddrSize = msg[l++];

另一个问题(我将要诊断 - 可能还有其他问题)是你的memcpy()正在复制到不确定的内存。您尚未初始化primaryIPaddr,因此它可能指向内存中的任何位置。

您必须始终确保知道数据的存储位置。可以说,你需要:

char *primaryIPaddr = malloc(primaryIPaddrSize);

然后进行记忆检查。

char *primaryIPaddr;
unsigned char primaryIPaddrSize = msg[l++];
AddToLog(logInfo, "PrimarySize: %u\n", primaryIPaddrSize);
char *primaryIPaddr = NULL;
if (primaryIPaddrSize != 0)
{
    primaryIPaddr = malloc(primaryIPaddrSize);
    if (primaryIPaddr == 0)
        ...handle out of memory...
    memcpy(primaryIPaddr, &msg[l], primaryIPaddrSize );
    AddToLog(logInfo, "PrimaryAddr: %s\n", primaryIPaddr);
    l += primaryIPaddrSize;
}

块2中的问题与块1中的问题非常对称,但您已经通过将数据复制到未知位置来破坏系统。块3中的代码不再需要指针。此外,端口号通常是2个字节(0..65535),但您的代码只能处理1个字节的端口号(因此您不会支持HTTPS,以及其他服务)。