返回C中的int数组

返回C中的int数组,c,arrays,pointers,C,Arrays,Pointers,我有以下代码: 1 #include <stdio.h> 2 #include <string.h> 3 #define LENGTH(a) sizeof(a)/sizeof(a[0]);

我有以下代码:

 1 #include <stdio.h>                                                               
 2 #include <string.h>                                                              
 3 #define LENGTH(a) sizeof(a)/sizeof(a[0]);                                        
 4                                                                                  
 5 int *getNbits(int, int, char *);                                                 
 6                                                                                  
 7 int main() {                                                                     
 8    char ins[] = "00001111000011110000111100001111";                              
 9    int *x = getNbits(0, 32, ins);                                                
 10                                                                                  
 11    for (int i = 0; i < LENGTH(x) ; i++){                                                
 12                                                                                  
 13       printf("%d", *(x + i));                                                        
 14    }                                                                             
 15    return 0;                                                                     
 16 }                                                                                
 17                                                                                  
 18 int* getNbits(int start, int offset, char instr[33]) {                           
 19                                                                                  
 20    int result[offset - 1];                                                       
 21    for (int i = 0; i < offset; i++) {                                            
 22        result[i] = instr[i + start] == '1' ? 1 : 0;   //- '0';                   
 23    }                                                                             
 24    return result;                                                                
 25 }         
1#包括
2#包括
3#定义长度(a)sizeof(a)/sizeof(a[0]);
4.
5 int*getNbits(int,int,char*);
6.
7 int main(){
8个字符ins[]=“00001111001110000111100111”;
9 int*x=getNbits(0,32,ins);
10
11表示(int i=0;i
基本上,getNbits()获取一个字符数组(0或1)并返回一个int数组,每个元素都是0或1

如果在for循环中创建数组时尝试打印数组“result”(使用printf(“%d”,result[I]),它将返回00001110000


但我在返回类型上遇到了问题,它给了我一个警告:函数返回局部变量的地址。主循环中的for循环只打印垃圾值

result
变量是getNbits的本地变量。这意味着一旦函数返回,它就可以被释放

不要将局部变量的地址作为指针返回-它可以并且将被释放

相反,按如下方式分配整数:

int* retVal =  malloc(sizeof(int) * 10);
然后从getNbits返回
retVal

int* getNbits(int start, int offset, char instr[33]) {                           
   int result[offset - 1];                                                       
   for (int i = 0; i < offset; i++) {                                            
      result[i] = instr[i + start] == '1' ? 1 : 0;   //- '0';                   
   }                                                                             
   return result;     
}
请参阅此URL:

注意:如果您使用上面的
malloc
,您还必须使用
free
来释放 不再需要后分配的内存:

/* When the array is no longer needed */ 
free(x);
在自由点,变量名是
x
,因为这是分配的左值 从呼叫getNbits开始。不要从getNbits调用
free

int* getNbits(int start, int offset, char instr[33]) {                           
   int result[offset - 1];                                                       
   for (int i = 0; i < offset; i++) {                                            
      result[i] = instr[i + start] == '1' ? 1 : 0;   //- '0';                   
   }                                                                             
   return result;     
}

当然,在上述情况下,当不再需要将分配的内存返回堆时,getNbits()的调用方必须记住在返回的数组上调用free()。

在main中分配数组更简单,也更不容易出错,在main中调用results数组

int result[ sizeof ins];    /* Size known at compile time */

getNbits(0, 32, ins, result);  /* Pass arrays by reference */
void getNbits(int start,int offset,const char instr[],int result[]){

这是在堆栈上使用
automatic
存储,当例程返回时,该存储会自动回收。正如问题中的代码所示,在堆栈上分配的printf变量将覆盖result指向的值

一个优点是通用了getNbits子例程,因此它可以处理较长版本的“ins”。当然,一个真正的程序会有一个getNbits返回的错误状态来捕捉错误

对于malloc、函数中的内存以及由调用方负责释放,都不是很好的做法,它很可能会泄漏或在以后多次被释放,使用更复杂的程序,这些程序通常很难跟踪bug

传统的代码通常定义结构或数组,从int result[]等函数作为静态存储传递,因此地址不在堆栈上。这是可行的,但不是线程安全的,并且必须复制存储在数据结构中的任何值


若您确实编写了一个动态构造数据结构的库函数,那个么将它和一个例程配对以进行整理,而不是将实现细节泄漏到调用者程序中!

int result
在您的getNbits函数中只会在getNbits调用期间存在。它是在堆栈上分配的数组。当函数返回时,堆栈空间被释放,调用代码将不再使用。您可能幸运地发现,堆栈的该部分仍然未被触及,但这是一个争用条件,在某个点上,堆栈区域将被其他代码覆盖
\define LENGTH(a)sizeof(a)/sizeof(a[0]);
-->
\define LENGTH(a)sizeof(a)/sizeof(a[0])
@MarcB:“你可能运气好,但堆栈的那部分仍然没有被触及”-如果我使用malloc()的话,那肯定是不幸运的要使堆中的数组能够在方法调用后检索数组?无需使用malloc,您可以从调用函数中声明一个本地数组并将其传递给被调用的hanks!我发现有关malloc的信息非常有用。它甚至使用类似我的代码的东西作为错误编码的显式示例。没有问题;请告诉我如果还有什么我可以做的。强制转换malloc的结果是一种不好的做法(请参阅),您应该从答案中删除它。更新以删除typecast;malloc将重新执行