Arrays 关于动态内存分配的几个问题

Arrays 关于动态内存分配的几个问题,arrays,c,Arrays,C,如果我在循环中动态定义一个数组,每次给它不同的值,并且在循环结束后我也不需要这个数组,那么我每次都需要释放数组的空间吗 例如,当我为字符串数组动态分配内存时,我是否也需要为其每个元素(字符串)分配内存 假设我有两个动态分配的数组: 我能做这个吗?(x是arr的指数): 如果是,我刚才切换的前一个元素的内存会发生什么变化?您的标题使用术语“动态内存分配”,而如果您的详细问题使用不同的术语和/或语法,则建议使用自动或静态分配。动态分配涉及直接或间接地使用分配函数,如malloc(),callo

如果我在循环中动态定义一个数组,每次给它不同的值,并且在循环结束后我也不需要这个数组,那么我每次都需要释放数组的空间吗

  • 例如,当我为字符串数组动态分配内存时,我是否也需要为其每个元素(字符串)分配内存

  • 假设我有两个动态分配的数组:

  • 我能做这个吗?(x是arr的指数):


    如果是,我刚才切换的前一个元素的内存会发生什么变化?

    您的标题使用术语“动态内存分配”,而如果您的详细问题使用不同的术语和/或语法,则建议使用自动或静态分配。动态分配涉及直接或间接地使用分配函数,如
    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;