我正在编写一个 C 程序来查找用户输入中最长的行并打印行的长度和行本身。它成功地计算了字符数,但意外地无法存储行本身。也许我误解了 C 的内存管理,有人可以纠正我。
编辑:后续问题:我现在明白,dummy
字符后面的块是未分配的,因此计算机可以对它们做任何事情,但是为什么一些字符的存储仍然有效?在我提到的第二个示例中,程序将字符存储在“未分配”块中,即使它“不应该”。为什么?
变量:
getchar()
c
每次我都存储在getchar()
i
getchar()
是我从的当前行的长度(到目前为止)longest_i
是迄今为止最长的线的长度twostr
指向两个字符串中第一个字符串的开头:第一个表示当前行,第二个表示迄今为止最长的行。当发现一行最长时,将其复制到第二个字符串中。如果未来的行更长,它会覆盖第二个字符串的一些内容,但这没关系,因为我不再使用它了——第二个字符串现在将从更右侧的位置开始。dummy
给出twostr
一个指向的地方
这就是我如何可视化程序变量使用的内存:
11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|\n| 7|11|15|c |u |r |r |e |n |t |\0|e |s |t |\0|p |r |e |v |l |o |n |g |e |s |t |\0|
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
真实的陈述:
&c == 11
&i == 12
&longest_i == 13
&twostr = 14
&dummy = 15
程序:
#include <stdio.h>
int main()
{
char c = '\0';
int i, longest_i;
char *twostr;
longest_i = i = 0;
char dummy = '\0';
twostr = &dummy;
while ((c=getchar()) != EOF)
{
if (c != '\n')
{
*(twostr+i) = c;
i++;
}
else
{
*(twostr+i) = '\0';
if (i > longest_i)
{
longest_i = i;
for (i=0; (c=*(twostr+i)) != '\0'; ++i)
*(twostr+longest_i+1+i) = c;
}
i = 0;
}
}
printf("length is %d\n", longest_i);
for (i=0; (c=*(twostr+longest_i+1+i)) != '\0'; ++i)
putchar(c);
return 0;
}
从*(twostr+longest_i+1))
直到'\0'
是不可预测的。例子:
输入:
longer line
line
输出:
length is 11
@
输入:
this is a line
this is a longer line
shorter line
输出:
length is 21
this is a longer lineÔÿ"