char *指向哪里?

时间:2014-06-09 06:38:03

标签: 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;
    }
    
  4. 输出:

     xyz
    

    编辑:

    在阅读了一些答案并首先发表评论后,我脑海中出现了另一个问题:

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

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

4 个答案:

答案 0 :(得分:5)

  1. 具体细节取决于实现,但在大多数常见实现中,像"a""xyz"这样的文字字符串存储在程序的文本部分中,就像实现了程序。分配a = "xyz";设置a以指向内存中的该位置。

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

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

答案 1 :(得分:1)

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

xyz放入内存的只读部分,并使c成为指向它的指针,这是一个名为c的指针类型的变量,它被初始化使用该未命名的只读数组中第一个字符的位置。您创建了自动存储(通常称为堆栈)。在这里,您只需指向文本部分的内存。

2.为“a”分配的内存位置会怎样?因为我不再使用它了?

根据你的代码,你没有分配任何内存只是你为它分配字符串文字。如果你分配,那么需要释放它。

3.如果我对注释部分不予评论,则代码似乎运行良好。在那种情况下,内存会发生什么?

如果您取消注释分配语句以分配内存,那么它也指向您的文字字符串,但您需要释放该内存。

现在为案例

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

当你声明并初始化单词时,它将被分配在堆栈上,就像任何其他自动数组一样,它的项目将被分配给指向每个字符串常量开头的指针。也可以改变这个字符串可能是非法的。

答案 2 :(得分:0)

&#34; XYZ&#34;和&#34; a&#34;是字符串文字,主要在字符串表中提供。

&#34; XYZ&#34;打印,因为它最近被分配给该指针。

答案 3 :(得分:0)

  1. 到字符串所在内存的READ-ONLY部分的堆/堆栈中的某个位置。当直接将string literal分配给指针时,程序会在内存中搜索该字符串,如果它通过他正在进行的短搜索存在,它会指向它,如果它没有 - 它将创建它。无论哪种方式,它都是只读的,所以它与const char*相同,所以你不能改变它(当然你可以用某种方式操纵它,也许用另一个指针左右)。
  2. 没什么,它会保持不受影响。
  3. 正在发生的事情是malloc返回一个指针,你只是忽略它,你转到另一个包含a的地址,它与strcpy(c, "a");的影响不同于忽略分配的内存及其指针 - 你做的不是免费的。一般情况下,如果你没有释放内存,就不会发生任何事情(我的意思是,在程序结束时它会被操作系统自动释放),但它会占用程序中的内存,所以如果我分配,那就说{{1字节(假设它成功),分配更多堆内存将是一个问题:P
  4. 关于另一个问题......你不能通过那个指针改变它们,尝试它会在程序中间抛出一个中断,它可能会停止响应。