问题描述
我正在通过指针通过以下两种方法使用C读取字符串,两者完全相同(至少它们对我来说是)。唯一的区别是在一种方法中,我已经指定了专用功能来完成这项工作。
方法1: //可以正常工作
#include <stdio.h>
int main()
{
char *str;
char delimiter='.';
int len=0;
scanf("%c",(str+len));
while(*(str+len)!=delimiter)
{
++len;
scanf("%c",(str+len));
}
++len;
*(str+len)='\0';
printf("%s",str);
return 0;
}
#include <stdio.h>
int readString(char *str,char delimiter)
{
int len=0;
scanf("%c",(str+len));
}
++len;
*(str+len)='\0';
return len;
}
int main()
{
char *str;
int len=readString(str,'.');
printf("%s",str);
return 0;
}
我完全不知道自己在做什么错。
在进一步使用方法2中的代码时,我观察到是否只是在代码int useless=-1;
和char *str;
行之间声明了带有初始化(如int len=readString(str,'.');
)的变量(甚至没有用)效果很好。
这进一步加剧了我的头痛。
有人可以解释真实情况吗?
我的猜测是它必须对悬空的指针执行某些操作,但是如果是这种情况,方法1也应该失败。
解决方法
在第一个代码中
scanf("%c",(str+len));
您正试图写入(访问)无效的内存位置。请注意,str
实际上是未初始化的,即它没有指向任何有效的存储位置。因此,该程序将调用 undefined behaviour ,并且无法以任何方式证明结果的正确性。
在第二个代码中,存在相同的问题,因此该行为再次未定义。