char*指向哪里?

Vag*_*ish 1 c

关于指针和内存分配,我有一些非常基本的问题.

  1. 在下面的代码指针c实际指向哪里?换句话说,字符串在哪里"xyz"存储在内存中(堆栈/堆等)?

  2. a因为我不再使用它而将分配给内存位置会发生什么?

  3. 如果我取消评论评论部分,代码似乎运作良好.在这种情况下,记忆发生了什么?

    #include<stdio.h>
    
    main()
    {
        char *c;
        //c = (char *)malloc(2);
        c = "a"; 
        c = "xyz" ; 
        printf("%s",c);
        return 0;
    }
    
    Run Code Online (Sandbox Code Playgroud)

输出:

 xyz
Run Code Online (Sandbox Code Playgroud)

编辑:

在阅读了一些答案和第一条评论之后,我想到了另一个问题:

  1. 在下面的情况下,字符串存储在哪里?我可以稍后更改它们吗?

      char *c[] = {"a","xyz"};
    
    Run Code Online (Sandbox Code Playgroud)

Bar*_*mar 5

  1. 具体细节是依赖于实现的,但在大多数常见的实现中,文字字符串喜欢"a""xyz"存储在程序的文本部分中,就像实现程序的机器代码一样.分配a = "xyz";a以指向内存中的该位置.

  2. 内存"a"不受影响.但是,优化编译器可能会注意到c在该赋值和重新分配之间从未使用过,因此它可以简单地忽略第一个赋值,并且永远不会为任何空间分配任何空间"a".

  3. 分配的内存malloc()保持分配,直到程序结束.在不释放内存的情况下分配内存称为内存泄漏,您应该尽量避免使用它.