c - char* 指向哪里?

标签 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;
     }
    

输出:

xyz

编辑:

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

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

    char *c[] = {"a","xyz"};
    

最佳答案

  1. 具体细节取决于实现,但在大多数常见实现中,"a""xyz" 等文字字符串存储在程序,就像实现程序的机器码一样。分配 a = "xyz"; 设置 a 指向内存中的那个位置。

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

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

关于c - char* 指向哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24114877/

相关文章:

c++ - 在服务器上使用的 2D 图形库

c - Oracle Berkeley DB 中记录概念的查询

c - 类型转换结构如何工作?

涉及管道的c并行进程

C:位标志有优先顺序吗?

c++ - 在 XCode 中桥接 C++ 和 Swift,正确的build设置是什么?

c - printf ("string1""string2") 这是有效的 C 语言吗?

c - 在不使用环回网络的情况下将数据包转发到同一主机中的服务

c++ - 有没有办法获取我发送给 C++ 中的对等方的 OpenSSL X509 证书名称?

c - netcdf c编程编译