Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
%printf中的s格式说明符 #包括 int main() { char str[11]=“HelloWorld”; printf(“%s\n”,str); printf(“%s\n”,str+3); /*这条线是魔鬼*/ printf(“%s\n”,str[2]);//%s需要一个addr而不是一个值。 返回0; }_C_Segmentation Fault_Printf - Fatal编程技术网

%printf中的s格式说明符 #包括 int main() { char str[11]=“HelloWorld”; printf(“%s\n”,str); printf(“%s\n”,str+3); /*这条线是魔鬼*/ printf(“%s\n”,str[2]);//%s需要一个addr而不是一个值。 返回0; }

%printf中的s格式说明符 #包括 int main() { char str[11]=“HelloWorld”; printf(“%s\n”,str); printf(“%s\n”,str+3); /*这条线是魔鬼*/ printf(“%s\n”,str[2]);//%s需要一个addr而不是一个值。 返回0; },c,segmentation-fault,printf,C,Segmentation Fault,Printf,为什么这一行给出了一个分段错误。是因为printf中的%s需要地址而不是值。 实际原因是什么???str[2]返回字符,而不是指向字符的指针。因此,printf将尝试从地址0x6c开始读取。就在这里,很有可能0x6c是一个无效地址,将导致segfault。但是,如果它不是无效的,则printf将继续读取,直到到达0x00字符,该字符很可能进入无效的地址范围 如果您想确切地知道它发生故障的原因,您需要在调试器中进行调试,这可能会很有趣,也很有教育意义 如果要修复碰撞线路,可以将其更改为: #inc

为什么这一行给出了一个分段错误。是因为
printf
中的
%s
需要地址而不是值。
实际原因是什么???

str[2]
返回字符,而不是指向字符的指针。因此,
printf
将尝试从地址
0x6c
开始读取。就在这里,很有可能
0x6c
是一个无效地址,将导致segfault。但是,如果它不是无效的,则
printf
将继续读取,直到到达
0x00
字符,该字符很可能进入无效的地址范围

如果您想确切地知道它发生故障的原因,您需要在调试器中进行调试,这可能会很有趣,也很有教育意义

如果要修复碰撞线路,可以将其更改为:

#include <stdio.h>
int main()
{
    char str[11] = "HelloWorld";
    printf("%s\n",str);
    printf("%s\n",str+3);

    /* This Line here is the devil */
    printf("%s\n",str[2]); // %s needs an addr not a value.

    return 0;
}

< P> >我认为它比<代码> STR + 2 更好。比< /P> < P> <代码> STR(2)< /Cord>返回字符,而不是指向字符的指针。因此,
printf
将尝试从地址
0x6c
开始读取。就在这里,很有可能
0x6c
是一个无效地址,将导致segfault。但是,如果它不是无效的,则
printf
将继续读取,直到到达
0x00
字符,该字符很可能进入无效的地址范围

如果您想确切地知道它发生故障的原因,您需要在调试器中进行调试,这可能会很有趣,也很有教育意义

如果要修复碰撞线路,可以将其更改为:

#include <stdio.h>
int main()
{
    char str[11] = "HelloWorld";
    printf("%s\n",str);
    printf("%s\n",str+3);

    /* This Line here is the devil */
    printf("%s\n",str[2]); // %s needs an addr not a value.

    return 0;
}

我认为比<代码> STR + 2 更好。因此,它试图访问地址“0x6c”(十六进制的“l”),这几乎肯定是一个无效地址。因此,访问该内存位置可能会被证明是非法的,从而导致分段错误。。OK..@Bhargav:传递给

printf
的格式说明符和实际类型不匹配会导致未定义的行为,这就是您的示例所做的。如果有可疑原因,您可以尝试删除它并亲自查看+不过,我想请你解释一下,你给的是一封信,而不是地址。因此,它试图访问地址“0x6c”(十六进制的“l”),这几乎肯定是一个无效地址。因此,访问该内存位置可能会被证明是非法的,从而导致分段错误。。OK..@Bhargav:传递给
printf
的格式说明符和实际类型不匹配会导致未定义的行为,这就是您的示例所做的。如果有可疑原因,您可以尝试删除它并亲自查看+不过,我还是要对答案做出很好的解释。我已经知道的最后一个建议。。我知道这是错误的,但无法找出segfault的确切原因:)第二句描述了一个可能实现的一种可能行为,但没有根本原因它是真的。正确的答案很简单,OP破坏了接口约定(
%s
要求在相应的参数位置有一个指向
char
的指针),因此行为是未定义的。我已经知道的最后一个建议。。我知道这是错误的,但无法找出segfault的确切原因:)第二句描述了一个可能实现的一种可能行为,但没有根本原因它是真的。正确的答案是OP破坏了接口约定(
%s
需要在相应的参数位置指向
char
的指针),因此行为是未定义的。