【问题标题】:Static variable in C not "working" [closed]C中的静态变量不“工作”[关闭]
【发布时间】:2016-01-04 15:27:09
【问题描述】:

我今天在编写一个在 C 中使用 static char* 的函数时遇到了问题。 让我解释一下:我的函数在我们发送给她的缓冲区中找到'\n',如果'\n' 后面有任何文本,它必须将此文本存储到名为rest 的静态变量中。事实是它存储了它,但 rest 的内容在函数的两次调用之间没有保留。而且我不明白为什么会发生这种情况,尽管它被声明为静态变量。

到目前为止,这是我的功能: (return (1) 表示该函数没有找到\n\0return (0) 表示该函数找到了\n,(return -1)表示该函数找到了EOF

static int  end_line(char *buf, char **line)
{
    static char *rest;
    char        *tmp;

    rest = NULL;
    tmp = ft_strnew(ft_strlen(buf));
    tmp = buf;
    printf("REST BEGINNING : %s\n", rest);
    if (rest != NULL)
    {
        tmp = ft_strnew(ft_strlen(rest) + ft_strlen(buf));
        tmp = ft_strcat(rest, buf);
    }
    if (!ft_strchr(tmp, '\n') && ft_strchr(tmp, '\0') == NULL)
    {
        rest = tmp;
        return (1);
    }
    else
    {
        ft_putstr("OK\n");
        *line = ft_strsub(tmp, 0, (ft_strlen(tmp) - ft_strlen(ft_strchr(tmp, '\n'))));
        rest = ft_strchr(tmp, '\n') + 1;
        if (ft_strlen(ft_strchr(tmp, '\0')) == 0)
            return (-1);
        return (0);
    }
}

【问题讨论】:

  • test_static 除了声明之外还有什么用处?
  • 抱歉,test_static 是我在发布之前忘记删除的测试^^ 将 rest 初始化为 NULL 有什么问题?
  • 真的应该给出更简洁的代码示例,更简洁地写问题。
  • 另外还有一个问题。
  • 问题不是初始化,而是赋值。

标签: c variables static


【解决方案1】:

一个主要问题是每次调用该函数时,您重新分配 NULLrest,而不是最初只是初始化rest

只需删除赋值,static 局部变量默认为零初始化(即指针将为 NULL)。

如果您确实希望显式初始化它,请在声明中这样做。例如:

static char *rest = NULL;

【讨论】:

  • 但是静态变量只初始化一次,对吧?当我在未初始化或将其初始化到声明中进行测试时,程序会产生段错误...
  • @S_Mindcore 然后你需要找出原因。一个原因可能是您将rest 分配给buf(无论如何都是间接的)。 buf(或者更确切地说,你最初传递给函数的第一个参数)的生命周期会比 rest 的使用时间长吗?你还应该想办法重置rest。您显示的代码中实际上有很多未知数,ft_* 函数是什么,它们有什么作用?并且您确实尝试在调试器中运行以捕捉正在发生的崩溃?
  • 我会尝试重置rest,看看buf的生命周期是否会影响rest,谢谢!所有 ft_* 函数都与 libc 中的函数完全相同,我自己编写了它们,但毫无疑问,它们的工作相同。 (除了strnew,它创建了一个新的字符串,初始化为NULL,参数中的大小)没有考虑在调试器中运行......
猜你喜欢
  • 2023-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-11
  • 2010-10-24
相关资源
最近更新 更多