将malloc'ed数组赋值给堆栈数组

时间:2012-05-19 06:07:56

标签: c pointers stack malloc heap

我试图在file1.c中将数组从child_prog()返回到main()。我尝试在下面给出伪代码。

#include<stdio.h>
#include<stdlib.h>
int* child_prog(int some_input);

void main(void){
  int C[10];
  int some_input;
  C = child_prog(some_input);
}

int* child_prog(int some_input){
  static int out[10];
  ...
  .../*some wizardry*/
  return out;
}

现在,编译器会生成一个错误,指出它无法分配给C(这是一个int []类型)从child_prog返回的值(这是一个int *类型)。虽然,当C int*malloc为10 ints内存时,该程序正常运行。我无法理解为什么编译器无法将C(一个定义为C[10]的数组,因此指针)分配给child_prog返回的值(定义为static int out[10]的数组并因此再次指针)。

4 个答案:

答案 0 :(得分:4)

  1. 您无法分配给数组。您需要memcpy它。
  2. int*!= int[],而第一个是指针,可能指向int s序列的int,第二个int s
  3. 的序列
  4. 您可以使用int *C;并将数组的长度(如果在编译时未知)作为out参数传递。
  5. static int out[10];不是malloc ed,而是静态。

答案 1 :(得分:1)

一种解决方案可以是将C声明为:

int *C;
正如Binyamin所说 您无法更改静态分配的数组地址,这正是您尝试使用的地址:

C = child_prog(some_input);

答案 2 :(得分:0)

  • int []的类型是int * const,这意味着它指向的内存是一个常量,尝试更改它会产生编译错误。显然它不等于int *
  • out中的变量child_prog()是静态分配的,这意味着它不在堆栈上,而是在全局数据部分的某个位置。因此,无论您拨打child_prog()多少次,您都将返回相同的内存位置。
  • 因此,要复制数组,如果要保存从memcpy(dest,src,bytes)返回的数据,请执行child_prog()

答案 3 :(得分:0)

#include<stdio.h>
#include<stdlib.h>

#define SUCCESS    0 
#define FAILURE    1 

int child_prog(int some_input, int *output, int output_size);

void main(void){
  int C[10];
  int some_input;
  C = child_prog(some_input, c, 10);
}

int  child_prog(int some_input, int *output, int output_size)
{
  static int source[10];
      ...
      .../*some wizardry*/

  memcpy(output, source, output_size);


     ... if (erronous Condition)
             return FAILURE;
         else

  return SUCCESS;
}