【问题标题】:Pointers and char[] in C [closed]C中的指针和char [] [关闭]
【发布时间】:2019-02-13 15:31:29
【问题描述】:

我不明白这些代码是如何工作的:

1)

#include <stdio.h>
int main()
{
char x[] = "gate2011";
char *ptr = x;
printf ("%s", ptr+ptr[3]-ptr[1]);
return 0;
}

// 2011

2) 这个给了我一个空白输出虽然应用程序说它应该导致 ineapp

#include <stdio.h>
int main()
{
char x[] = "sanguineapp";
char *ptr = x;
printf ("%s", ptr+ptr[5]-ptr[2]);
return 0;
}

3) 还有这个和输出应该是 nguineapp

#include <stdio.h>
int main()
{
char x[] = "sanguineapp";
char *ptr = x;
printf ("%s", ptr+ptr[9]-ptr[4]);
return 0;
}

【问题讨论】:

  • 你试过了吗?只需查看代码,我会期望以下输出:1)“te2011”,2)“guineapp”3)“ineapp”
  • 我已经将输出放在我的问题中,但与应用程序测验的答案相比,您都错了。你能解释一下你是怎么解决的吗?
  • @user287107 2011 在第一个谜语中。

标签: c pointers char


【解决方案1】:

要了解所有这三个代码块的工作原理,您必须开始阅读优秀的 C 书籍,特别是数组和指针概念。

案例1:-在下面的代码块中

int main(void) {
    char x[] = "gate2011";
    char *ptr = x;
    printf ("%s", ptr+ptr[3]-ptr[1]);
    return 0;
}

看起来像

 x[0]   x[1]   x[2]     x[3]   x[4]    x[5]     x[6]   x[7]    x[8]
 0x100  0x101  0x102   0x103   ..                                   -->(assume 0x100 is base address of x )
 ---------------------------------------------------------------------
| g   |   a   |   t   |   e   |   2   |   0   |  1   |   1   |   \0   |
----------------------------------------------------------------------
x
ptr (ptr = x, i.e ptr points to base address of x)

这个

ptr+ptr[3]-ptr[1]) == 0x100 + ( 'e' - 'a' )
                   == 0x100 +  4
                   == 0x104

所以当printf() 执行时,它将从0x104 开始打印直到\0,因此它打印2011

案例2:-在下面的代码块中

int main(void){
        char x[] = "sanguineapp";
        char *ptr = x;
        printf ("%s", ptr+ptr[5]-ptr[2]);
        return 0;
}

看起来像

x[0]   x[1]   x[2]     x[3]   x[4]    x[5]     x[6]   x[7]    x[8] ..
 0x100  0x101  0x102   0x103   ..                                   --> (assume 0x100 is base address of x )
 ---------------------------------------------------------------------------------
| s   |   a   |   n   |   g   |   u   |   i   |  n   |   e   |   a   |  p  | \0  |
---------------------------------------------------------------------------------
x
ptr (ptr = x, i.e ptr points to base address of x)

这个

ptr+ptr[5]-ptr[2] == 0x100 + ( 'i' - 'n' )
                  == 0x100 + ( -5) /* so it will try to access invalid memory i.e base address 5 */

所以当printf()执行时,由于你给printf()提供了错误的地址,这个语句的o/p导致未定义的行为,你很幸运它没有崩溃。

在第三种情况下也会发生同样的情况。

【讨论】:

    【解决方案2】:

    这是一个非常不安全的代码:)

    如果你替换两个数组访问,你会得到

    #include <stdio.h>
    int main()
    {
    char x[] = "gate2011";
    char *ptr = x;
    printf ("%s", ptr+'e'-'a');
    return 0;
    }
    

    如果你看一下ascii表,你会发现'e'-'a'是4。这个结果是

    #include <stdio.h>
    int main()
    {
    char x[] = "gate2011";
    char *ptr = x;
    printf ("%s", ptr+4);
    return 0;
    }
    

    告诉 printf 在跳过前 4 个项目时开始打印字符串

    第二个不起作用, 它会打印 ptr - 5,因此它实际上是在随机的未定义位置访问内存

    其他类似

    【讨论】:

    • 但是在下一个,在ascii表中n是'.'
    • 下一个给出否定结果,这就是为什么这段代码很不安全
    • 我现在明白了。谢谢!
    • 在此处写作时,请使用通常的英语惯例来区分大小写和标点符号 - 总的来说,所有句子都应以大写字母开头,并以某种标点符号结尾。
    猜你喜欢
    • 2021-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多