当前位置: 首页 > 知识库问答 >
问题:

在函数中使用strorage时使用malloc和char数组的区别[Ⅰ]

罗业
2023-03-14

使用array[size]和使用malloc()定义一个长度在运行时之前定义的数组(取决于命令行参数)有什么区别<代码>数组[i]导致数据放在堆栈上,malloc()使用堆[参见此stackoverflow]

因此,对于大数据,我可能会遇到堆栈溢出,但在一台新机器上,总共30个char和int应该不会有问题(根据这一点,windows上的堆栈大约为1MB)。

所以我可能错过了一些显而易见的东西。

据我所知,在main()中定义时,两者应该是相同的:

示例1

int size; // depends on some logic
char array[size];

示例2

int size; // depends on some logic
array= (char *)malloc(size * sizeof(char));
free(array); // later after use

但是当我在函数内部使用数组并将其作为指针(func(char*ray))或数组(Funct(char ray[]))移交时,有时gdb调试器让我知道该函数在#1中收到损坏的数据,使用malloc()修复了问题。

如果在编译时未确定数组,是否可以使用它?是否存在范围界定问题?这个答案有一条评论暗示了这样的事情,但我不太明白这是否适用于这里。

我正在使用C99。

共有1个答案

娄振
2023-03-14

主要区别在于,使用固定大小声明的数组是堆栈分配的(对它或其元素的引用仅在其范围内有效),而malloc数组是堆分配的。

堆栈分配意味着变量直接存储到内存中。对该内存的访问通常非常快,它的分配是在编译过程中完成的。

另一方面,在堆上分配的变量在运行时分配了它们的内存,并且-虽然访问该内存较慢-您唯一的限制是虚拟内存的大小。

请看这里:

https://gribblelab.org/CBootCamp/7_Memory_Stack_vs_Heap.html

 类似资料:
  • 本文向大家介绍Lua中使用.和:调用函数的区别,包括了Lua中使用.和:调用函数的区别的使用技巧和注意事项,需要的朋友参考一下 tb.print和tb:print的含义略微不同,:调用函数会多传递进去一个self进去,差不多相当于OOP里面的成员函数调用. 但是和OOP里面成员函数/非成员函数不同的是,lua里面的非成员函数.调用,他不是静态的. tb对象有一个print function成员,当

  • 我在使用malloc和calloc创建动态数组时遇到问题。 输出是 你能告诉我我做错了什么吗?

  • 问题内容: 当我运行以下代码时,我得到了数组的地址: 但是,当我声明一个字符数组并以相同的方式打印它时,它将为我提供数组的实际内容。为什么? 问题答案: 类(即类)具有专用的方法重载,可打印char数组的字符。 对于其他数组,它没有特殊的重载,因此,当您传递时,被调用的方法是。该方法通过调用其方法将传递的对象转换为字符串。 所有数组的方法都只是从class继承的默认数组,它显示了它们的类名和默认哈

  • 本文向大家介绍Lua中调用函数使用点号和冒号的区别,包括了Lua中调用函数使用点号和冒号的区别的使用技巧和注意事项,需要的朋友参考一下 本文是面向对象预热篇,讲解函数两种调用方式的区别,初学者比较容易被坑。 1.初学者最易混乱Top1——调用函数时用点号还是用冒号? 我们来看看下面的两句代码: 对于初次接触Lua的朋友来说,这简直就是噩梦,为嘛函数的调用有两种形式,是让我们随便挑的意思吗?   这

  • 本文向大家介绍C++中CopyFile和MoveFile函数使用区别的示例分析,包括了C++中CopyFile和MoveFile函数使用区别的示例分析的使用技巧和注意事项,需要的朋友参考一下 1、函数定义 CopyFile(A, B, FALSE);表示将文件A拷贝到B,如果B已经存在则覆盖(第三参数为TRUE时表示不覆盖) MoveFile(A, B);表示将文件A移动到B 2.函数原型 Cop

  • 我正在尝试运行下面的程序,在该程序中,我使用一个名为Reserve的函数动态地为变量分配内存。当我运行应用程序时,由于在一个单独的函数中为一个空指针分配内存,我会得到分段错误,但是如果我想在主函数中分配内存,我不会得到这个错误。那我做错了什么? 代码如下: