【问题标题】:Array of pointers to strings printing null指向打印 null 的字符串的指针数组
【发布时间】:2020-09-28 05:00:09
【问题描述】:

我在一个只有 C 子集的受限操作系统 (xv6) 中学习 C。我正在尝试将单个字符串拆分为一个字符串数组。

为此,我构建了一个指向字符串lines 的指针数组。我的期望是线条最终看起来像这样: lines = { "abc", "def", "ghi" }

当我尝试按索引访问行(例如行[0])时,我得到了null。我很难过为什么我会变得空,并尝试了几件事。我很确定我遗漏了一些非常明显的东西。

注意:不是在寻找工作代码,因为我想自己继续构建它,但希望得到一些关于我为什么会得到这个结果的指导。

#define STDIN 0
#define STDOUT 1

static void readline(){
    char buff[] = "abc\ndef\nghi";
    int i,j;
    char current[20];
    char *lines[20];
    int counter = -1;
    int lines_counter = -1;
    for(i = 0; i < 14; i++) {
        if(buff[i] == '\n' || buff[i] == '\0'){
            lines_counter++;
            for(j = 0; j < 4; j++) {
                lines[lines_counter][j] = current[j];
            }
            counter = -1;
        } else {
          current[++counter] = buff[i];
        }
    }
    printf(STDOUT, "%s", lines[0]); // expected "aaa", instead output is(null)
}

int main(int argc, char *argv[]) {
    readline(); 
    exit();
}

【问题讨论】:

  • lines[lines_counter][j] 也是未初始化的内存访问。
  • 换句话说,lines 是一个由 20 个指针组成的数组,每个指针都不指向任何地方并且当前未初始化。您必须先为指针分配有效的存储空间,然后才能开始在那里存储字符。您可以通过使用malloccallocrealloc 为每个指针动态分配存储空间,或者通过将现有数组的起始地址分配给每个指针来分配存储空间。 (注意: 您可以让行中的每个指针指向 buf 中的不同现有字符,然后将 buf 中的 '\n's 替换为 '\0' 并使用 buf 作为现有存储)
  • 仅供参考,counterlines_counter 都不需要初始化为 -1,也不需要重置为相同,如果您以更高程度的理智构建循环。实际上,如果您弄清楚如何从零开始以及何时递增每个/任一,它将使代码更易于编写和阅读。无论如何,这段代码是 Botn 在调试器中运行,单步执行并观察变量/内存以了解您编写的内容正在做什么,以及它与您的预期有何不同。
  • 要使用 %s 格式说明符,字符串必须以空值结尾。所以你必须附加 '\0' 字符。
  • @DavidC.Rankin 这正是问题所在。感谢您的提示,我来自不需要显式内存分配的高级语言。我花时间了解了有关 malloc、calloc 和 realloc 的更多信息。

标签: c xv6


【解决方案1】:

我建议只查看strtok 的源代码并尝试扩展任何标准库调用。 strchr 只是在字符串中搜索字符,strcspn 只是计算 strchr 返回之前的字符数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多