Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
请解释输出,其中C字符指针被分配到新内存而没有Malloc调用 #包括 int 主要() { char*a=“你好”; a=“你好,世界”; printf(“%s”,a); 返回0; }_C_Pointers_Memory Management - Fatal编程技术网

请解释输出,其中C字符指针被分配到新内存而没有Malloc调用 #包括 int 主要() { char*a=“你好”; a=“你好,世界”; printf(“%s”,a); 返回0; }

请解释输出,其中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

现在,该程序返回更正并打印“Hello_World”

但我记得我读过,为了更改一次初始化的字符串指针,我必须使用malloc分配内存,然后输入字符串的新值


请解释一下?特别是为字符串的新更改值分配的内存在哪里,以及旧内存如何。

使用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)
Exception
n
保存一个立即数,而
a
保存字符在内存中其他位置的地址。但通常不鼓励我们对字符串执行此类操作,这是为什么?通常,当我们需要动态字符串时,我们使用mallocAlso,现在在函数中,如果我们使用一个局部变量,比如n=10,那么当我们离开函数的作用域时,该变量的内存将被释放。字符串文字也一样吗?您不是在分配字符串,而是在分配地址。指针所持有的变量类型。你不能做
charb[10]然后
b=“你好”因为数组不是左值且无法赋值(仅初始化)。这是另一个例子。这里它类似于
inti=5;int j=20;int*c=&i
c=&j您只是给指针分配了一个不同的地址。这就是所有的
a
是一个指针,它可以容纳和寻址。