2012-05-19 92 views
1

我试图从file1.c中的child_prog()main()返回一个数组。我试着给出下面的伪代码。malloc'ed数组到stack'ed数组的分配

#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
  1. 您不能分配给数组。你需要memcpy吧。
  2. int*!= int[]而第一是一个指针可能指向的int秒的序列的int,第二是序列int小号
  3. 可以使用int *C;和通过的长度数组(如果在编译时未知)作为out参数。
  4. static int out[10];不是malloc ed,但是是静态的。
+0

好的,理解点数为1即int *!= int []。但是,如果我将C定义为int * C而不是int C [],并且malloc是已知的内存量,并且child_prog返回C指向静态int数组的指针,我应该不能绕过需要做memcpy? – Abhinav

+0

如果你不是分配给一个数组,而是分配给一个指针,你不需要'memcpy'。 – MByD

+0

感谢您杀死我的很多龙......相当快 – Abhinav

1

一种解决方案可以申报C作为:由本雅明 说你不能改变一个数组的地址,因为它是静态分配的,这正是你试图用做

int *C; 

C = child_prog(some_input); 
+0

是的,现在就明白了。感谢您的回复。 – Abhinav

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

感谢您的回复。 – Abhinav

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; 
}