请解释输出,其中C字符指针被分配到新内存而没有Malloc调用 #包括 int 主要() { char*a=“你好”; a=“你好,世界”; printf(“%s”,a); 返回0; }
现在,该程序返回更正并打印“Hello_World” 但我记得我读过,为了更改一次初始化的字符串指针,我必须使用malloc分配内存,然后输入字符串的新值请解释输出,其中C字符指针被分配到新内存而没有Malloc调用 #包括 int 主要() { char*a=“你好”; a=“你好,世界”; printf(“%s”,a); 返回0; },c,pointers,memory-management,C,Pointers,Memory Management,现在,该程序返回更正并打印“Hello_World” 但我记得我读过,为了更改一次初始化的字符串指针,我必须使用malloc分配内存,然后输入字符串的新值 请解释一下?特别是为字符串的新更改值分配的内存在哪里,以及旧内存如何。使用gcc-S查看生成的汇编程序 你会看到像这样的东西 #include <stdio.h> int main () { char *a = "Hello"; a = "Hello_World"; print
请解释一下?特别是为字符串的新更改值分配的内存在哪里,以及旧内存如何。使用gcc-S查看生成的汇编程序 你会看到像这样的东西
#include <stdio.h>
int
main ()
{
char *a = "Hello";
a = "Hello_World";
printf ("%s", a);
return 0;
}
.LC0:
.string "Hello"
.LC1:
.string "Hello_World"
它作为常量在.data节中分配。
那就这样用
#include <stdio.h>
int
main ()
{
char *a = "Hello";
a = "Hello_World";
printf ("%s", a);
return 0;
}
.LC0:
.string "Hello"
.LC1:
.string "Hello_World"
“Hello”
和“Hello\u World”
都是字符串文字,从技术上讲,它们是驻留在只读内存中的字符数组(很少有例外)。因此,每个数组都有自己的地址,在访问时,数组将转换为指向其第一个元素的指针。由于两个数组在访问时都转换为指针(根据此处不相关的例外情况),因此可以将它们分配给指针a
,其中a
将该地址作为其值。类似于int n=5;n=9;printf(“%d\n”,n)
Exceptionn
保存一个立即数,而a
保存字符在内存中其他位置的地址。但通常不鼓励我们对字符串执行此类操作,这是为什么?通常,当我们需要动态字符串时,我们使用mallocAlso,现在在函数中,如果我们使用一个局部变量,比如n=10,那么当我们离开函数的作用域时,该变量的内存将被释放。字符串文字也一样吗?您不是在分配字符串,而是在分配地址。指针所持有的变量类型。你不能做charb[10]代码>然后b=“你好”代码>因为数组不是左值且无法赋值(仅初始化)。这是另一个例子。这里它类似于inti=5;int j=20;int*c=&i
c=&j代码>您只是给指针分配了一个不同的地址。这就是所有的a
是一个指针,它可以容纳和寻址。