修改函数中的向量

时间:2013-12-29 16:51:21

标签: c function pointers vector

我在修改函数内部的指针时遇到了(可能非常基本的)问题。我想将一个向量传递给一个函数。该函数创建一个类似的向量(相同的大小,类型等...)然后我想将这个新的向量分配给我的旧向量。

以下是一些模拟正在发生的事情的代码

#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并调用它一天,但在我的原始代码中,我必须对另一个向量进行操作,最后修改原始向量。

5 个答案:

答案 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)

使用memcpymanpage)将一个数组的内容复制到另一个数组。你不能简单地分配,因为你在你的函数中使用了一个临时数组。

答案 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));