Arrays 为什么将%s视为字符。为什么字符串作为指针会有如此不寻常的行为
此代码的输出:- Hello与%s 在此处检查:-Arrays 为什么将%s视为字符。为什么字符串作为指针会有如此不寻常的行为,arrays,pointers,Arrays,Pointers,此代码的输出:- Hello与%s 在此处检查:- //为什么指针字符串会出现这种异常行为 您正在调用未定义的行为 设置arr=”“后引用arr+2是指拾取任意一段内存(在本例中,是一段字符串文字)。当您运行程序时,内存的布局使得常量字符串和%s正好位于常量空字符串之后。内存如下所示: int main() { char *arr="hello"; clrscr(); printf("%s",arr); arr=""; printf("and %s",arr+2); getc
//为什么指针字符串会出现这种异常行为 您正在调用未定义的行为
设置
arr=”“
后引用arr+2
是指拾取任意一段内存(在本例中,是一段字符串文字)。当您运行程序时,内存的布局使得常量字符串和%s
正好位于常量空字符串之后。内存如下所示:
int main()
{
char *arr="hello";
clrscr();
printf("%s",arr);
arr="";
printf("and %s",arr+2);
getch();
return 0;
}!
将空字符串指定给a
时,将a
指向\0
字符。然后计算a+2,结果指向n
字符
因此,当您将+2解释为以NUL结尾的字符串时,会得到nd%s
当然,这是未定义的行为。许多编译器按使用顺序排列常量:此处空字符串位于
和%s
之前。但是,没有什么强迫编译器这样做,如果它以不同的方式布置内存,您将得到不同的结果。程序甚至可能崩溃。您没有创建指向字符串的指针>。。您在内存空间中创建了一个用于全局变量和常量的块..并使用指针指向该块..您不能更改该值,因为它是常量内存空间的一部分..您所做的是将指针重新分配到另一个内存位置,并希望幸运地指向所需的位置..它不会总是发生你想做什么???arr+2是一个无效的位置,但为什么这样的无效输出??即使我这样做:arr=“y”也会看到相同的输出,但为什么它总是从printf()中的字符串中获取??。。我的数组arr=”“没有指向printf stringNo的第一个索引('\0'根据u),它指向printf的参数前面的0字节,这将生成一个空字符串。如果添加一个,a+1
,则得到的地址超过零一个字节,即a
。如果您添加两个,a+2
,您将获得n
的地址。懂
. . . \0 a n d ' ' % s \0 . . .