代码之家  ›  专栏  ›  技术社区  ›  Ramasamy Kandasamy

为一个指针指向的位置赋值会影响另一个指针的值

  •  0
  • Ramasamy Kandasamy  · 技术社区  · 6 年前
    //foo.c
    
    #include <stdio.h>
    
    int main()
    {
        int a = 1;
        int *pn = &a;
        printf("%lld\n", (long long int) pn);
    
        char *pc = ((char *) pn ) + 4 * (sizeof(char));
        printf("%lld\n", (long long int) pn);
    
        *pc = '\0'; //This assignment changes the value of pn.
        printf("%lld\n", (long long int) pn);
    }
    

    在上面的C程序中,字符指针 pc pn . 转让 *pc = '\0' 更改的值 pn公司

    gcc -o foo foo.c
    ./foo
    

    输出如下:

    140736942845732
    140736942845732
    140736942845696
    

    你能知道为什么分配给 *pc pn公司 ?

    1 回复  |  直到 6 年前
        1
  •  -2
  •   Neminda Prabhashwara    6 年前

    当我们定义一个整数时,它分配的内存大小取决于操作系统。我希望你的问题就是这样。 我纠正了我之前回答的错误:对于一个整数,它在64位操作系统中分配4个字节,在32位操作系统中分配2个字节。 但在赋值后改变内存位置完全是操作系统的任务。只要变量有自己的值,内存的位置就无关紧要。我必须说你的程序没有错误。

        2
  •  1
  •   ジョージ    6 年前

    #include <stdio.h>
    
    int main()
    {
        int a[2] = {1, 1};
        int *pn = &(a[0]);
        printf("%p\n", pn);
    
        char *pc = ((char *) pn ) + 4 * (sizeof(char));
        printf("%p\n", pn);
    
        *pc = '\0'; //This assignment changes the value of pn.
        printf("%p\n", pn);
    }
    

    系统上的输出(64位):

    $ gcc -o foo foo.c
    $ ./foo
    
    0x7ffffcfa6870
    0x7ffffcfa6870
    0x7ffffcfa6870