动态内存分配和指针相关概念疑惑

Dynamic memory allocation and pointers related concept doubts

首先说明:这对我来说是一个新概念!! 我最近研究了指针和动态内存分配并执行了一些程序,并且想知道在语句 char*p="Computers" 中字符串存储在某个内存位置和基地址中, 即字符串的起始地址存储在 p 中,现在我注意到我可以对字符串执行任何所需的操作,现在我的疑问是当我们可以声明这样的字符串时为什么要使用像 malloc 和 calloc 这样的特殊语句所需的长度。

如果我对这个概念的理解有误,请解释。

提前致谢。

在此声明中

char*p="Computers";

指针p由字符串文字"Computers"的第一个字符的地址初始化。

字符串文字具有静态存储持续时间。您不能更改字符串文字,例如

p[0] = 'c';

任何更改字符串文字的尝试都会导致未定义的行为。

函数malloc用于动态分配内存。例如,如果你想动态创建一个包含字符串 "Computers" 的字符数组,你应该写

char *p = malloc( 10 ); // the same as `malloc( 10 * sizeof( char ) )`
strcpy( p, "Computers" );

您可以更改创建的字符数组。例如

p[0] = 'c';

不再需要数组后,您应该释放分配的内存,如

free( p );

否则程序可能会发生内存泄漏。

一个简单的答案就是 char *p = "Computers"; 你基本上是在声明一个固定的常量字符串。这意味着您不能编辑字符串中的任何内容。尝试这样做可能会导致分段错误。使用 malloc 和 calloc 将允许我们编辑字符串。

只需在 p[0] = 'c' 上执行此操作,您就会看到结果

作为新手,以下是我自己的思考...

动态内存完全依赖于指针。我的意思是,在没有指针知识的情况下,您可以应对动态内存分配。 (stdlib) 库函数,其中存储 callocmallocrelallocfree.

malloc初始化没提,calloc主要用于数组。 realloc 用于增大或减小大小。

简单地说,它并没有你最初想象的那么难。如果您声明了一个 array[500] 初始声明,但您使用了 100 位,其余 400 位删除以使用动态内存。

像这样的语句

char *p = "Computers";

不是动态内存分配的例子。程序启动时会留出字符串文字的内存,并一直保留到程序终止。您无法调整该内存的大小,并且您不应该修改它(这样做的行为是 undefined - 它可能会按预期工作,它可能会彻底崩溃,它可能会介于两者之间的任何东西)。

我们使用 malloccallocrealloc 在运行时分配需要可写、可调整大小并且在我们显式释放之前不会消失的内存。

我们必须使用指针来引用 dynamically-allocated 内存,因为这正是语言的设计方式,但指针在 C 编程中发挥的作用比仅仅跟踪动态内存要大得多。