2012-07-21 35 views
2

我做到以下几点:如何在移动指针后释放一些字节?

void * myFunction(void) { 
    void *someBytes = malloc(1000); 
    // fill someBytes 

    //check the first three bytes (header) 
    if(memcmp(someBytes, "OK+", 3) == 0) { 
     // move the pointer (jump over the first three bytes) 
     someBytes+=3 
    } 

    return someBytes; 
} 

接收器如何能够释放malloced指针? 当然我可以在指针上做-3。

但是这种情况下是否有最佳做法? 是否有在接收器功能仍然允许调用free(someBytes); 因为someBytes还可以举办多种兆我想避免的memcpy一个简单的解决方案(malloc(1000)是唯一的例子)。

+0

我相信你要找的是什么'realloc' - 这样一来,当你通过与数据你刚才读,您可以不断调整分配的字节大小。虽然,您已经通过立即分配1000个字节来让我们全部失败。从它的声音中,您实际上想要创建一个面向事件的流式阅读器,由几个情况组成。简单地说:'tmp = read(3); if(memcmp(tmp,“OK +”,3)== 0){free(tmp); tmp = read(997);/*此处更多的条件测试* /} else {free(tmp); } - 只读你所要的。 (除了嵌套if之外,它将是oop。) – 2012-07-21 14:45:08

回答

1

没有任何办法(除非你碰巧知道确切的偏移量)。最佳做法是存储原始指针的副本,以便稍后使用它来释放内存。

void* myFunction(void) { 
    void* someBytes = malloc(1000); 
    void* pos = someBytes; 
    // fill someBytes 

    //check the first three bytes (header) 
    if(memcmp(pos, "OK+", 3) == 0) { 
     // move the pointer (jump over the first three bytes) 
     pos+=3 
    } 

    return someBytes; 
} 
+0

这不会被编译。但是,那么OP的例子也不会。好吧。 – 2012-07-21 14:30:27

+0

是的..这是pseude /示例代码。 :) – 2012-07-21 14:33:11

1

为什么不定义一个结构并让你的函数分配并返回一个指针呢?

struct MyStruct { 
    PrivateHeader *header; 
    UserData* data; 
}; 

PrivateHeader是一个不透明的指针数据,只有myFunction知道如何访问/操纵;您的功能的消费者只知道如何访问/操作data

+0

也认为,但我不能改变接收器的代码。我需要检查三个字节的头并在三个字节后返回缓冲区,并确保接收者可以释放缓冲区。我认为唯一的办法是memcpy(或memmov) – 2012-07-21 14:47:51

0

接收器是否也可以创建缓冲区?为什么myFunction会分配它不会删除的内存?

void* myFunction(void) { 
    void* someBytes = malloc(1000); 

    return someBytes; 
} 

是有点相当于(功能)来:

size_t myFunction(void* someBytes, size_t size) { 
    // do something 

    if(memcmp(someBytes, "OK+", 3) != 0) { 
     return 0; // didn't find nuthin' 
    } 

    return how_many_bytes_myFunction_put_in_the_buffer; 
} 


void myCaller(void) 
{ 
    void* someBytes = malloc(1000); 

    size_t result = myFunction(someBytes, 1000); 

    // do something amazing 

    free(someBytes); 
} 
+0

是的。设计可能会更好......该函数需要创建并返回malloc块(如X_init函数)。 – 2012-07-21 15:45:51

+0

@JonasSchnelli,为什么?谁删除它?你在写myFunction吗?你在编写调用myFunction的函数吗?如果对最后两个问题的答案是否定的,那么你不能做AFAIK,但返回你指向的malloc。你可以尝试做两个读取,一个获得“OK +”和一个获取数据。把数据放在你malloc的块中。丢弃包含“OK +”的数据(这可能是堆栈中的简单3字节数组)。 – 2012-07-21 15:51:21