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

问题描述

首先,对我来说这是一个新概念!! 我研究了指针和动态内存分配,并在最近执行了一些程序,并想知道在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 -它可能按预期工作,可能会完全崩溃,在这之间可能会发生任何事情)。

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

我们必须使用指针来引用动态分配的内存,因为这只是语言的设计方式,但是指针在C编程中的作用远不只是跟踪动态内存。

,

作为新手,我在下面描述了自己的想法……

动态内存完全取决于指针。我的意思是,没有指针知识,您就可以应付动态内存分配。 (stdlib)库函数,用于存储callocmallocrelallocfree

malloc未初始化,calloc主要用于数组。 realloc用于增大或减小尺寸。

简单地说,它并不像您最初想的那样难。如果您声明array[500]初始声明,但您使用了100,其余的400位则删除以使用动态内存。