【问题标题】:Deallocation of Dynamic Arrays?动态数组的重新分配?
【发布时间】:2013-04-14 19:32:04
【问题描述】:

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

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,但是没有用。任何帮助将不胜感激。谢谢!

【问题讨论】:

  • 请展示更多,尤其是你如何声明FrameBuffer
  • 另外,除非添加字符串终止符'\0',否则不能将其用作字符串。
  • 我将其声明为... char *FrameBuffer=calloc(2048,sizeof(char));
  • 如果它真的只包含一个以空字符结尾的字符串,那么您不需要释放或清除它,只需将'\0' 写入最后一个字节即可。恐怕你让我们猜到你所说的“reset”是什么意思。
  • 嗯,也许我对“空终止字符串”一词感到困惑。 while 循环的第一次迭代几乎要经过 99 次,而第二次迭代将经过 98 次。我想要的 FrameBuffer[0]-FrameBuffer[97] 将被覆盖。但是该 FrameBuffer[98] 将具有与第一次迭代相同的内容。我想要它,以便每次迭代后 FrameBuffer 中都没有任何内容。

标签: c arrays dynamic


【解决方案1】:

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

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

    while(temp[i]!=3) {

【讨论】:

  • 嗯,我试过了,但仍然没有清空 FrameBuffer 的内容。
  • 我已经测试了代码并且它可以工作。您确定 printf 语句或用于检查 FrameBuffer 内容的任何内容在代码中的正确位置吗?
  • 所以 memset 成功了。唯一不起作用的是“sizeof(FrameBuffer)”,但是当我将其更改为 StrLen 时,它确实起作用了。非常感谢你们的帮助。当我了解 C 中的新关键字时总是很高兴。
  • memset() 是一个函数,而不是关键字。
【解决方案2】:

由于您没有显示声明或对输入字符串 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),但从可用信息中并不能完全清楚。

【讨论】:

    猜你喜欢
    • 2011-05-31
    • 1970-01-01
    • 2021-03-27
    • 1970-01-01
    • 2020-03-06
    • 2020-04-02
    • 2014-01-04
    • 2019-05-02
    • 1970-01-01
    相关资源
    最近更新 更多