背景:
这一切都始于我朋友使用文件编写的程序。
跳过其他细节,我将重点放在真正吸引我注意力的地方。
- 文件中有文本需要提取为字符串。
- 字符串可以有不同的长度。
- 为了实现这一点并且不额外花费一个字节,他使用了动态内存分配。他首先计算了大小,然后用 malloc 创建了一个足够大小的字符串,然后将字符插入到目标字符串中。
这很好,但我倾向于考虑是否有另一种方法可以在没有任何额外字节的情况下将字符存储在字符串中。
我带来了以下程序:
代码:
/* 为简单起见,我在这里使用了另一个字符串“c”而不是文件,需要从中复制数据。将 ch 视为来自 File 的读取字符。
# include <stdio.h>
# include <string.h>
void main()
{
char *s,*p;
char c[4] ="abc";
char q[2] = "";
s=q;
int i;
for(i=0;c[i]!='\0';i++)
{
char ch = c[i];
int len = strlen(s);
char p[len+2];
strcpy(p,s);
p[len]=ch;
p[len+1]='\0';
printf("%s\n",p);
s=p;
}
char t[strlen(s)+1];
strcpy(t,s);
printf("%s\n",t); //EDIT for understanding: If I print s here it prints garbage,
but if I see the value of s through debugger, it gives
correct value?
}
理解:
- 字符串 p 的作用域是 for 循环,每次迭代我们都会得到它的新定义。
- 字符串的起始地址保存到变量 s 中,这就是为什么即使代码超出范围也可以访问内存,这用于在遇到新字符时确定字符串的大小。
问题:
1.如果我上面的理解是正确的,那么就缺少了一些东西。我这样说是因为如果我直接尝试打印 s,它会打印垃圾,而不是 strcpy s 到 t 并打印 t(它给出正确的 O/P)。我不确定这种行为?
2.这个程序有内存损坏的可能吗?
PS:我知道多个 strcpy() 过度杀戮,因此程序没有优化,只是问这个问题来理解这种行为。