动态内存分配和指针相关概念疑惑
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) 库函数,其中存储 calloc
、malloc
、relalloc
和 free
.
malloc
初始化没提,calloc
主要用于数组。
realloc
用于增大或减小大小。
简单地说,它并没有你最初想象的那么难。如果您声明了一个 array[500]
初始声明,但您使用了 100 位,其余 400 位删除以使用动态内存。
像这样的语句
char *p = "Computers";
不是动态内存分配的例子。程序启动时会留出字符串文字的内存,并一直保留到程序终止。您无法调整该内存的大小,并且您不应该修改它(这样做的行为是 undefined - 它可能会按预期工作,它可能会彻底崩溃,它可能会介于两者之间的任何东西)。
我们使用 malloc
、calloc
和 realloc
在运行时分配需要可写、可调整大小并且在我们显式释放之前不会消失的内存。
我们必须使用指针来引用 dynamically-allocated 内存,因为这正是语言的设计方式,但指针在 C 编程中发挥的作用比仅仅跟踪动态内存要大得多。
首先说明:这对我来说是一个新概念!! 我最近研究了指针和动态内存分配并执行了一些程序,并且想知道在语句 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) 库函数,其中存储 calloc
、malloc
、relalloc
和 free
.
malloc
初始化没提,calloc
主要用于数组。
realloc
用于增大或减小大小。
简单地说,它并没有你最初想象的那么难。如果您声明了一个 array[500]
初始声明,但您使用了 100 位,其余 400 位删除以使用动态内存。
像这样的语句
char *p = "Computers";
不是动态内存分配的例子。程序启动时会留出字符串文字的内存,并一直保留到程序终止。您无法调整该内存的大小,并且您不应该修改它(这样做的行为是 undefined - 它可能会按预期工作,它可能会彻底崩溃,它可能会介于两者之间的任何东西)。
我们使用 malloc
、calloc
和 realloc
在运行时分配需要可写、可调整大小并且在我们显式释放之前不会消失的内存。
我们必须使用指针来引用 dynamically-allocated 内存,因为这正是语言的设计方式,但指针在 C 编程中发挥的作用比仅仅跟踪动态内存要大得多。