为什么使用 char* 指针在 C 中读取字符串的一种方法有效,而其他方法无效?
Why one method of reading string in C using char* pointer works while other doesn't?
我正在使用指针读取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)='[=10=]';
printf("%s",str);
return 0;
}
方法二: // 不行,屏幕上什么也打印不出来
#include <stdio.h>
int readString(char *str,char delimiter)
{
int len=0;
scanf("%c",(str+len));
while(*(str+len)!=delimiter)
{
++len;
scanf("%c",(str+len));
}
++len;
*(str+len)='[=11=]';
return len;
}
int main()
{
char *str;
int len=readString(str,'.');
printf("%s",str);
return 0;
}
我完全不知道自己做错了什么。
在进一步使用方法 2 中的代码时,我观察到我是否只是在行 char *str;
和 int len=readString(str,'.');
之间声明一个带有初始化(如 int useless=-1;
)的变量(甚至无用)代码工作正常。
这让我更加头疼。
谁能解释一下到底是怎么回事?
我的猜测是它必须对悬挂指针做一些事情,但如果是这种情况,方法 1 也应该失败。
在第一个代码中
scanf("%c",(str+len));
您正在尝试写入(访问)无效的内存位置。注意 str
实际上是未初始化的,即它没有指向任何有效的内存位置。因此,程序调用 undefined behaviour 并且结果无法以任何方式证明是合理的。
在第二个代码中,存在同样的问题,因此行为再次未定义。
我正在使用指针读取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)='[=10=]';
printf("%s",str);
return 0;
}
方法二: // 不行,屏幕上什么也打印不出来
#include <stdio.h>
int readString(char *str,char delimiter)
{
int len=0;
scanf("%c",(str+len));
while(*(str+len)!=delimiter)
{
++len;
scanf("%c",(str+len));
}
++len;
*(str+len)='[=11=]';
return len;
}
int main()
{
char *str;
int len=readString(str,'.');
printf("%s",str);
return 0;
}
我完全不知道自己做错了什么。
在进一步使用方法 2 中的代码时,我观察到我是否只是在行 char *str;
和 int len=readString(str,'.');
之间声明一个带有初始化(如 int useless=-1;
)的变量(甚至无用)代码工作正常。
这让我更加头疼。
谁能解释一下到底是怎么回事?
我的猜测是它必须对悬挂指针做一些事情,但如果是这种情况,方法 1 也应该失败。
在第一个代码中
scanf("%c",(str+len));
您正在尝试写入(访问)无效的内存位置。注意 str
实际上是未初始化的,即它没有指向任何有效的内存位置。因此,程序调用 undefined behaviour 并且结果无法以任何方式证明是合理的。
在第二个代码中,存在同样的问题,因此行为再次未定义。