我有一些关于指针和内存分配的基本问题。
在下面的代码中,指针c
实际指向哪里?换句话说,字符串"xyz"
在哪里存储在内存中(堆栈/堆等)?
为a
分配的内存位置会发生什么变化,因为我不再使用它了?
如果我取消评论评论部分,代码似乎运作良好。在那种情况下,记忆会发生什么?
#include<stdio.h>
main()
{
char *c;
//c = (char *)malloc(2);
c = "a";
c = "xyz" ;
printf("%s",c);
return 0;
}
输出:
xyz
编辑:
在阅读了一些答案并首先发表评论后,我脑海中出现了另一个问题:
在下面的情况下,字符串会被存储吗?我可以稍后更改它们吗?
char *c[] = {"a","xyz"};
答案 0 :(得分:5)
具体细节取决于实现,但在大多数常见实现中,像"a"
和"xyz"
这样的文字字符串存储在程序的文本部分中,就像实现了程序。分配a = "xyz";
设置a
以指向内存中的该位置。
"a"
的内存不受影响。但是,优化编译器可能会注意到c
从未在该赋值和重新分配之间使用,因此它可以简单地忽略第一个赋值,并且永远不会为"a"
分配任何空间。
您在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)
const char*
相同,所以你不能改变它(当然你可以用某种方式操纵它,也许用另一个指针左右)。strcpy(c, "a");
的影响不同于忽略分配的内存及其指针 - 你做的不是免费的。一般情况下,如果你没有释放内存,就不会发生任何事情(我的意思是,在程序结束时它会被操作系统自动释放),但它会占用程序中的内存,所以如果我分配,那就说{{1字节(假设它成功),分配更多堆内存将是一个问题:P