我在修改函数内部的指针时遇到了(可能非常基本的)问题。我想将一个向量传递给一个函数。该函数创建一个类似的向量(相同的大小,类型等...)然后我想将这个新的向量分配给我的旧向量。
以下是一些模拟正在发生的事情的代码
#include <stdio.h>
#include <stdlib.h>
void change(int *vec){
int i;
int vec2[10];
for(i=0;i<10;i++) vec2[i]=i+1;
vec=vec2;
}
int main(){
int i,ind[10];
for(i=0;i<10;i++) ind[i]=i;
for(i=0;i<10;i++) printf("%d ",ind[i]);
printf("\n");
change(ind);
for(i=0;i<10;i++) printf("%d ",ind[i]);
printf("\n");
return 0;
}
此程序的输出只显示原始ind
向量的两倍
0 1 2 3 4 5 6 7 8 9
0 1 2 3 4 5 6 7 8 9
虽然我想
0 1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9 10
请注意,这不是我的实际代码,只是一个小得多的版本来显示问题。我知道在这个版本中我可以修改函数内部的vec
并调用它一天,但在我的原始代码中,我必须对另一个向量进行操作,最后修改原始向量。
答案 0 :(得分:2)
将您的change
功能替换为
void change(int *vec){
int i;
for(i=0;i<10;i++) vec[i]=i+1;
}
并了解数组参数为decayed into pointers。请参阅this。
如果你真的想将数组视为值,请将它们包含在某些struct
中,如
struct myarray_st {
int arr[10];
};
然后代码。
struct myarray_st increment(const struct myarray_st*p, int x)
{
struct myarray_st res;
for (int i=0; i<10; i++) res.arr[i] = p->arr[i]+x;
return res;
}
或使用某个指针作为输出参数,例如
void
increment_it(struct myarray_st*dst, const struct myarray_st*src, int x)
{
for (int i=0; i<10; i++) dst->arr[i] = src->arr[i]+x;
}
然后代码
struct myarray_st t1, t2;
memset (&t1, 0, sizeof(t1));
memset (&t2, 0, sizeof(t2));
t2 = increment(&t1,7);
increment_it(&t2,&t1,12);
答案 1 :(得分:1)
在您的情况下,无需在本地阵列(vec2[10])
上操作。您可以直接对传递的数组进行操作。
答案 2 :(得分:0)
使用memcpy
(manpage)将一个数组的内容复制到另一个数组。你不能简单地分配,因为你在你的函数中使用了一个临时数组。
答案 3 :(得分:0)
您无法返回静态分配的数组,而是动态分配数组,并传递该指针。实际上从函数返回后vec2
无效。
所以你可以做以下事情..
void change(int *vec){
int i;
int *vec2=malloc(10*sizeof(int));
for(i=0;i<10;i++) vec2[i]=i+1;
vec=vec2;
}
但这样就有可能发生内存泄漏。在需要结束后,您需要在功能之外free(vec);
。
另一方面,您可以使用memcopy
..
memcpy(vec,vec2,sizeof(vec2));
答案 4 :(得分:0)
如果您确实想使用vec2
,请使用以下代码代替vec=vec2;
memcpy(vec,vec2,sizeof(vec2));