Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.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 指针更改后的堆栈内存_C_Memory Management - Fatal编程技术网

C 指针更改后的堆栈内存

C 指针更改后的堆栈内存,c,memory-management,C,Memory Management,假设我这样做: const char*myvar=NULL 后来 *myval=“你好” 然后再说一遍: *myval=“世界” 我想了解存储“hello”的内存会发生什么变化 我知道它是在只读堆栈空间中,但是在运行时,内存空间是否会永远留在那里,而没有其他进程可以使用该内存空间 谢谢你的意思 myval = "world"; 相反,那么 我想了解存储“hello”的内存会发生什么变化 没什么 您只需修改指针本身以指向其他字符串文字 C程序中的字符串文字是静态固定的不可修改的字符数组,具有完整

假设我这样做:

const char*myvar=NULL

后来

*myval=“你好”

然后再说一遍:

*myval=“世界”

我想了解存储“hello”的内存会发生什么变化

我知道它是在只读堆栈空间中,但是在运行时,内存空间是否会永远留在那里,而没有其他进程可以使用该内存空间

谢谢你的意思

myval = "world";
相反,那么

我想了解存储“hello”的内存会发生什么变化

没什么

您只需修改指针本身以指向其他字符串文字


C程序中的字符串文字是静态固定的不可修改的字符数组,具有完整程序的生命周期。赋值确实使指针指向这样一个数组的第一个元素。

字符串文字具有静态存储持续时间。它们通常由编译器放在堆栈池中。因此,在程序运行之前创建字符串文本

在这些声明中

*myval = “hello”;

*myval = “world”;
指针myval由这两个字符串文本的第一个字符的地址重新分配

请注意,您不能更改字符串文字。是否将相等的字符串文本存储为单字符数组或具有静态存储持续时间的不同字符数组取决于编译器选项

来自C标准6.4.5字符串文本

7未说明这些数组是否不同,前提是它们的 元素具有适当的值。如果程序试图 如果修改这样的数组,则行为未定义


谢谢你的回复。我明白,但是存储hello的内存区域会发生什么呢?它是否可供同一应用程序以后使用?@davidvillasmi请参阅我的附加帖子。谢谢弗拉德,让我这样说:它可供同一应用程序以后使用吗?假设我有一个长时间运行的程序,它经常这样做,这会导致内存泄漏吗?@DavidVillasmil内存泄漏发生在您使用具有分配的存储持续时间且未被释放的对象时。所以,具有静态存储持续时间的对象不会发生内存泄漏。具有静态存储持续时间的对象在程序执行的所有时间都处于活动状态。感谢回复。我明白,但是存储hello的内存区域会发生什么呢?是否可供同一应用程序以后使用?假设我有一个长时间运行的程序,它经常这样做,这会导致内存泄漏吗?@DavidVillasmil所有字符串都存储在程序可执行文件中,并在加载程序时加载到内存中。在程序运行的整个过程中,它们都保留在内存中。它不是堆的一部分,也不是任何可以回收的东西。或者任何会泄漏的东西。