c - 使用for循环分配内存

标签 c arrays pointers memory-management

我的怀疑只是关于内存分配,所以不要考虑程序输出

#include<stdio.h>

int main(){

  for(int i=0;i<20;i++){
     char *str=malloc(sizeof(char)*6); //assuming length of each string is 6
     scanf("%s",str);
     insertinlinkedlist(str);
  } 

} 

每当我在这里分配内存时,如上所示,只有 char 数组的基地址将传递给链表,即分配给 char 数组的内存块仅在 main 内,我将该数组的基地址存储在 str 是 main 的本地并传递给 insetinlinkedlist

我想问的是,每当在循环内分配内存时,为什么 创建的内存块(没有声明的 char 数组)等于 n(时间循环运行次数),因为变量名相同,我们应该被定向到相同的内存位置 请注意,当循环运行内存 str 的值不同时,我已经通过一直运行循环来检查编译器

is The above method is correct of allocating memory through loop and through same variable "Is the method ensures that every time we allocate memory in above manner their will be no conflicts while memory allocation and every time we will get the address of unique memory block"

现在毫无疑问也在我心中产生了疑问 如果我们做那样的事情

int main(){
   for(int i=0;i<n;i++){
   array[50];


   } 
}

然后它还会在栈帧中创建 50 个数组

最佳答案

malloc 返回指向第一个分配字节的指针。它在内部跟踪分配了多少内存,因此它知道要释放多少(顺便说一句,您确实需要插入对 free() 的调用,否则会泄漏内存)。通常,它通过在它给您的指针之前分配一点内存并将长度存储在那里来实现这一点,但是并不需要那样做。

malloc 分配的内存与 main 没有任何关系。目前 main 是唯一一个其局部变量具有指向该内存的指针的函数,但是您可以将指针传递给另一个函数,并且该函数也可以访问该内存。此外,当调用 malloc 的函数返回时,该内存将保持分配状态,除非手动释放。

变量名无关紧要。指针(对一阶近似值)只是一个数字。很像如何运行 int a = 42; a = 20; 被允许并用新值替换 a 的先前值,int *p = malloc(n); p = malloc(n); 将首先将第一次 malloc 调用返回的指针分配给 p,然后将其替换为第二次调用的返回值。您还可以有多个指向同一地址的指针:

int *a = malloc(42);
int *b = malloc(42);
int *c = a;
a = malloc(42);

在该代码的末尾,c 将设置为第一个 malloc 调用返回的值,而 a 将具有最后一个 malloc 调用返回的值。就像你这样做一样:

//assume here that f() returns a different value each time
//it's called, like malloc does
int a = f(); 
int b = f(); 
int c = a;
a = f();

关于你问题的第二部分:

for(int i=0;i<n;i++){
   int array[50];
} 

上面的代码将在当前堆栈帧中创建一个数组,该数组的空间足以容纳 50 个整数。它将在 for 循环内的 block 中是本地的,并且不会在迭代之间持续存在,因此它不会创建数组的 n 个单独副本。由于以这种方式声明的数组 本地堆栈框架的一部分,因此您不需要手动释放它们;当您退出该 block 时,它们将不复存在。但是您可以将指向该数组的指针传递给另一个函数,只要您没有退出该 block ,它就是有效的。所以下面的代码...

int sum(int *arr, size_t n) {
   int count = 0;
   for (size_t i = 0; i < n; i++) { 
       count += arr[i];
   }
   return count;
}

for(int i=0;i<n;i++){
   int array[50];
   printf("%d\n", sum(array, 50));
}

...将是合法的(无论如何,从内存管理的角度来看;您永远不会初始化数组,因此未定义求和调用的结果)。

作为一个小旁注,sizeof(char) 被定义为 1。在这种情况下您可以只说 malloc(6)sizeof 在分配较大类型的数组时是必需的。

关于c - 使用for循环分配内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53012431/

相关文章:

c - atoi() 用于二维数组

c - 返回文件大小的函数?

Javascript - 循环遍历数组

java - 将数组值设置为等于 Java 动态加载类中的变量

c++ - 为什么取消引用数组会导致相同的地址?

c - 如何在 C 中的被调用函数中使用文件指针

c - 从 C 中的 argv 中读取

c - 不同的平台在 C 中有不同的 double 吗?

php - PHP 中如何将数组赋值给字符串?

c - 在不知道大小的情况下输入字符串