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