动态数组的重新分配?

时间:2013-04-14 19:32:04

标签: c arrays dynamic

这是我正在使用的代码......

while(temp[i]!=0){
    while(temp[i]!=3){
        FrameBuffer[a]=temp[i];
        i++;
        a++;
    }
    FrameBuffer[a]=temp[i];
    printf(" Framebuffer: %s ", FrameBuffer);
    result=layer1(FrameBuffer,PacketAction);
    i++;
    a=0;
}

问题在于我希望FrameBuffer每次通过内部while循环时都会被重置(FrameBuffer的大小在循环开始时为0)。我尝试过使用free(FrameBuffer),但是我收到错误,因为我不止一次释放数组。我也尝试过编写FrameBuffer = NULL,但这不起作用。任何帮助将不胜感激。谢谢!

2 个答案:

答案 0 :(得分:2)

如果您只需要在每个内循环开始之前初始化FrameBuffer,可以使用memset - :

while(temp[i]!=0) {
    memset(FrameBuffer, 0, sizeof(FrameBuffer));

    while(temp[i]!=3) {

答案 1 :(得分:0)

由于您没有显示声明或对输入字符串temp给出特别好的描述,因此您很难知道自己在做什么。

#include <assert.h>
#include <stdio.h>
#include <stdlib.h>

extern int somefunc(const char *fb, int pa);
extern int layer1(const char *fb, int pa);

int somefunc(const char *temp, int PacketAction)
{
    int rc = 0;
    char *FrameBuffer = calloc(2048, sizeof(char));
    if (FrameBuffer != 0)
    {
        int i = 0;
        while (temp[i] != '\0')
        {
            int a = 0;
            while (temp[i] != 3)
                FrameBuffer[a++] = temp[i++];
            FrameBuffer[a++] = temp[i++];
            FrameBuffer[a] = '\0';
            assert(a < 2048);
            printf("Framebuffer: %.*s\n", a, FrameBuffer);
            int result = layer1(FrameBuffer, PacketAction);
            if (rc == 0)
                rc = result;
        }
    }
    return rc;
}

这可能已经足够了。函数layer1FrameBuffer中得到一个以空字符结尾的字符串(它没有其他可见的方法来确定数据的长度)。

请注意,通过在外部循环的范围内声明a,我不需要在循环结束时重新初始化它。我使用a++i++来增加计数器;它允许使用紧凑的符号而不会损失经验丰富的C程序员的可读性 - 尽管我承认它对于新手程序员来说可能会有点难度。不过,这个成语值得学习。

我想知道内循环是否应检查'\0'以及3(又名'\3''\003');我需要知道空值是否可以出现在temp而不是最后。显示的代码采用了一种懒惰的方式来验证FrameBuffer没有溢出。如果函数被告知输入temp的长度,那就更好了:

void somefunc(const char *temp, size_t templen, int PacketAction)

代码可以更有弹性地编写。它可能使用strlen(temp),但现有信息并不完全清楚。