在C中更改函数内部的数组
发布时间:2020-12-16 10:01:15 所属栏目:百科 来源:网络整理
导读:我正在学习C并且困惑为什么在主要内部创建的数组不会在函数内部发生变化,我假设传递的数组是一个指针,并且更改指针应该更改数组,对吧?谁可以解释在这种情况下发生了什么? thx的帮助. int main(){ int i,length = 10; int array[length]; for (i = 0 ; i le
我正在学习C并且困惑为什么在主要内部创建的数组不会在函数内部发生变化,我假设传递的数组是一个指针,并且更改指针应该更改数组,对吧?谁可以解释在这种情况下发生了什么?
thx的帮助. int main(){ int i,length = 10; int array[length]; for (i = 0 ; i < length ; i++) array[i] = i * 10; printf("Before:"); print(array,length); change(array,length); printf("After:"); print(array,length); return 0; } // Print on console the array of int void print(int *array,int length) { int i; for(i = 0 ; i < length ; i++) printf("%d ",array[i]); printf("n"); } // Change the pointer of the array void change(int *array,int length) { int *new = (int *) malloc(length * sizeof(int)); int i; for(i = 0 ; i < length ; i++) new[i] = 1; array = new; } 我希望看到以下输出: Before:0 10 20 30 40 50 60 70 80 90 After:1 1 1 1 1 1 1 1 1 1 我得到了什么: Before:0 10 20 30 40 50 60 70 80 90 After:0 10 20 30 40 50 60 70 80 90 解决方法
在
c中,您不能通过引用传递变量,您在函数内分配的数组变量最初包含与传递指针相同的地址,但它是它的副本,因此修改它不会改变传递的指针.
你需要传递指针的地址才能改变它,就像这样 // Change the pointer of the array void change(int **array,int length) { *array = malloc(length * sizeof(int)); if (*array == NULL) return; for (int i = 0 ; i < length ; i++) (*array)[i] = 1; } 然后在main()中你不能分配给一个数组,通过这种函数这样做肯定是未定义的行为. main()中定义的数组是在堆栈上分配的,你不能为数组赋值,因为它们是不可写的左值,所以你不能指向使用malloc()获得的堆内存位置,你需要传递一个指针像这样 int *array; change(&array,length); free(array); 如果你想让函数替换以前的数组,它必须free()malloc()ed数据(请注意,将NULL传递给free()是很好的定义),所以 // Change the pointer of the array void change(int **array,int length) { free(*array); *array = malloc(length * sizeof(int)); if (*array == NULL) return; for (int i = 0 ; i < length ; i++) (*array)[i] = 1; } 然后在main() int *array; array = NULL; change(&array,length); change(&array,length); free(array); 会做你显然想要的. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |