Arrays 关于动态内存分配的几个问题
如果我在循环中动态定义一个数组,每次给它不同的值,并且在循环结束后我也不需要这个数组,那么我每次都需要释放数组的空间吗Arrays 关于动态内存分配的几个问题,arrays,c,Arrays,C,如果我在循环中动态定义一个数组,每次给它不同的值,并且在循环结束后我也不需要这个数组,那么我每次都需要释放数组的空间吗 例如,当我为字符串数组动态分配内存时,我是否也需要为其每个元素(字符串)分配内存 假设我有两个动态分配的数组: 我能做这个吗?(x是arr的指数): 如果是,我刚才切换的前一个元素的内存会发生什么变化?您的标题使用术语“动态内存分配”,而如果您的详细问题使用不同的术语和/或语法,则建议使用自动或静态分配。动态分配涉及直接或间接地使用分配函数,如malloc(),callo
如果是,我刚才切换的前一个元素的内存会发生什么变化?您的标题使用术语“动态内存分配”,而如果您的详细问题使用不同的术语和/或语法,则建议使用自动或静态分配。动态分配涉及直接或间接地使用分配函数,如
malloc()
,calloc()
,或realloc()
,这正是我将主要讨论的内容
free()
释放该空间或程序终止(以先到者为准)。在释放内存之前,该程序用于未来分配的可用内存会更少,如果它继续分配,则会使用更多内存。最终,它将耗尽,在此之前,它可能会导致性能问题或更糟,不仅对其自身,而且对其他进程也是如此
一般规则是,每个分配都必须与相应的free配对,尽管您可以对需要保留到程序终止为止的分配进行一些篡改
char
的指针,但必须理解字符串是内存中以null结尾的char
序列,因此不是指针。可以通过指向字符串的指针访问字符串,但不能将指针与其所指向的字符串混淆
如果您分配空间来存储指向字符串的指针,无论是动态还是其他方式,这都会为指针生成空间,而不是为指针指向的任何对象生成空间。您需要为字符串本身单独提供。这也可能意味着动态地为这些字符串分配额外的空间,但也可能意味着指向已经通过其他方式分配的字符串
char *** arr = { {....}, {....},{.....},.... };
char ** newArr = { ......... };
我能做这个吗?(x是arr的指数):
如果是,我刚才切换的前一个元素的内存会发生什么变化
无论
arr
和newArr
是如何分配的,只要x
是arr
的有效索引,您就可以执行该分配。它将存储在arr[x]
中的指针值替换为存储在newArr
中的指针值,使两个指针指向同一对象。这对arr[x]
的原始值或其新值指向的数据没有影响。特别是,它不会导致释放任何内存,因此,如果arr[x]
的原始值指向动态分配的内存,并且您没有指向同一动态分配块的其他指针,则无法再释放该块。这被称为“内存泄漏”。您能更具体一点吗?显示这三种情况的代码。1。对2.对3.它们看起来不像是动态分配的数组,@SouravGhosh我的意思是理论上,我只是想说明它们是什么样子。数组中arr
指向每个点的各个元素是否都指向它们自己的动态分配内存块?这些指针是这些动态分配内存块地址的唯一副本吗?如果两个问题的答案都是肯定的,则行arr[x]=newArr
将导致a,因为通过覆盖该内存块地址的唯一副本,您不再知道它是什么,因此您无法再释放它。那么我是否需要先释放(arr[x])
?在给它分配newArr之前,我需要为它分配新的内存吗?非常感谢,我只是想问一下(2):如果我为每个字符串数组元素(字符数组*)分配内存,那么我不能“物理地”在其中存储字符串,否则我只能存储指向它们的指针?两种语言的赋值语法是否保持相同?(例如char**arr,char*str,arr[2]=str)@ItamarIvri,分配函数分配您请求的空间量。你可以随心所欲地使用它。但是,如果您为n个char*
类型的对象分配大小为的空间,并使用它存储n个char*
类型的对象,那么就没有剩余空间用于其他任何对象。分配函数对数据类型一无所知——它们严格按照字节大小进行处理。
arr[x] = newArr;
char *** arr = { {....}, {....},{.....},.... };
char ** newArr = { ......... };
arr[x] = newArr;