问题描述
首先,对我来说这是一个新概念!! 我研究了指针和动态内存分配,并在最近执行了一些程序,并想知道在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'
上执行此操作,您就会看到结果
类似
的语句char *p = "Computers";
不是动态内存分配的示例。程序启动时保留字符串文字的存储空间,直到程序终止为止。您不能调整该内存的大小,也不能修改它(这样做的行为是 undefined -它可能按预期工作,可能会完全崩溃,在这之间可能会发生任何事情)。
我们使用malloc
,calloc
和realloc
在运行时分配需要可写,可调整大小并且在我们明确释放它们之前不会消失的内存。
我们必须使用指针来引用动态分配的内存,因为这只是语言的设计方式,但是指针在C编程中的作用远不只是跟踪动态内存。
,作为新手,我在下面描述了自己的想法……
动态内存完全取决于指针。我的意思是,没有指针知识,您就可以应付动态内存分配。 (stdlib)库函数,用于存储calloc
,malloc
,relalloc
和free
。
malloc
未初始化,calloc
主要用于数组。
realloc
用于增大或减小尺寸。
简单地说,它并不像您最初想的那样难。如果您声明array[500]
初始声明,但您使用了100,其余的400位则删除以使用动态内存。