0

假设我有这个逻辑数组,我想将它分成 1 部分和 0 部分,创建两个单独的向量。

所以我想出了以下方法:

void cut_and_uncut(long* input, int length, long* cut_part, int* cut_length, long* uncut_part, int* uncut_length){
  int i;
  int n_cut=0;
  for(i=0;i<length;i++) n_cut+=input[i];
  cut_part = vecallocl(n_cut);
  uncut_part = vecallocl(length-n_cut);
  *cut_length = n_cut;
  *uncut_length = length-n_cut;
  int index_cut = 0;
  int index_uncut = 0;
  for(i=0;i<length;i++){
    if(input[i]==1){
      cut_part[index_cut] = i;
      index_cut++;
    } else {
      uncut_part[index_uncut] = i;
      index_uncut++;
    }
  }
}
  • input是长度的输入向量length(太有想象力了!)
  • cut_part是具有 1 的索引的向量,长度为cut_length
  • uncut_part是具有 0 索引的向量,长度为uncut_length

(注:vecallocl(k)只是 的快捷方式malloc(k*sizeof(long))

我用这个函数调用

int len,len2;
long* cut_vec;
long* uncut_vec;
cut_and_uncut(split,matrix.m+matrix.n,cut_vec,&len,uncut_vec,&len2);

两个整数(lenlen2)已正确填充,但是当我尝试查看cut_vecuncut_vec向量时,会发生段错误。

我有预感,我对内存做错了,因为我初始化了两个指针,而它们实际上没有指向任何东西..但是在函数中,使用实际的 vecallocl,它们应该被正确初始化。

当我从这个函数内部打印向量cut_and_uncut时,一切正常......当在外面做它时(即在同一级别调用这个函数)它没有。

怎么了?

4

1 回答 1

2

尝试这个:

void cut_and_uncut(long* input, int length, long** cut_part, 
    int* cut_length, long** uncut_part, int* uncut_length)

....
// inside the function you now use `*cut_part` instead of `cut_part`, etc.

if(input[i]==1){
      *cut_part[index_cut] = i;
      index_cut++;
} else {
      *uncut_part[index_uncut] = i;
      index_uncut++;
}

并且不传递(仍然未分配的)指针,而是传递它们所在的地址:

long *cut_part;
long *uncut_part;

cut_and_uncut(... &cut_part, &uncut_part, ...)

这样,修改将在cut_and_uncut()返回后保留。

于 2013-07-20T10:01:12.497 回答