返回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将重新执行