0
#define BUFF_SIZE 100000
unsigned char buffer[BUFF_SIZE];

void myfunc(unsigned char[],int,int);
void myfuncinfunc(unsigned char[],int,int);

int main()
{
int a = 10, b = 10;
myfunc(buffer,a,b);
}

void myfunc(unsigned char array[],int a,int b)
{
int m,n;
//blah blah
myfuncinfunc(array,m,n);
}

void myfuncinfunc(unsigned char array[],int a, int b)
{
//blah blah
}

我想知道以下内容:

  1. 我创建了一个静态数组,如“main”函数上方所示。这有效率吗?如果我使用点和 malloc 代替会更好吗?

  2. 我知道它不使用堆栈,所以当我将数组传递给内部函数时,它会创建整个数组的副本还是只发送第一个条目的位置?

  3. 在函数“myfunc”中处理“数组”时,我是直接使用静态定义的数组还是一些本地副本?

  4. 在函数“myfunc”中,当我们将数组传递给函数“myfuncinfunc”时,是否会再次将第一个位置或数组的完整副本发送到堆栈中?

感谢您阅读这个问题,并非常感谢任何帮助!我是 C 的新手,并试图从互联网上学习它。

4

2 回答 2

2
  1. 我看不出它比堆上的数组效率更高或更低。
  2. 它衰减为指向第一个条目的指针。
  3. 因此它不是本地副本,而是数组本身。
  4. 同上。

顺便说一句,如果ab是数组中的索引,请考虑size_t为它们使用类型(unsigned int对于索引数组来说保证足够大)。

于 2014-03-03T13:35:05.753 回答
1
  1. 我创建了一个静态数组,如“main”函数上方所示。这有效率吗?如果我使用点和 malloc 代替会更好吗?

定义“高效”。由于分配/释放的运行时开销,静态分配的数组总是比动态数组快。

在这种情况下,您分配了大量的 100k 字节,这可能是非常低效的内存。

此外,您的进程可能没有那么多可用的静态内存,具体取决于操作系统。因此,在桌面系统上,当您使用大量数据时,在堆上分配被认为是最佳实践。

  1. 我知道它不使用堆栈,所以当我将数组传递给内部函数时,它会创建整个数组的副本还是只发送第一个条目的位置?

您不能在 C 中按值传递数组。因此,指向数组第一个元素的指针将保存在堆栈中并传递给函数。

  1. 在函数“myfunc”中处理“数组”时,我是直接使用静态定义的数组还是一些本地副本?

直接放在静态数组上。同样,您不能按值传递数组。

在函数“myfunc”中,当我们将数组传递给函数“myfuncinfunc”时,是否会再次将第一个位置或数组的完整副本发送到堆栈中?

指向第一个元素的指针。

于 2014-03-03T13:58:07.060 回答