Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
填写作为指针传递的向量(C)_C_Pointers_Memory - Fatal编程技术网

填写作为指针传递的向量(C)

填写作为指针传递的向量(C),c,pointers,memory,C,Pointers,Memory,假设我有一个逻辑数组,我想把它分成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 = vecallo

假设我有一个逻辑数组,我想把它分成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++;
    }
  }
}
两个整数(
len
len2
)已正确填充,但当我尝试查看
cut_vec
uncut_vec
向量时,会发生SEGFULT

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


当我从这个
cut_和uncut
函数内部打印向量时,一切都正常。。在外部执行此操作时(即在调用此函数的同一级别),它不会执行此操作

怎么了?

试试这个:

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()
返回后,修改将被保留。

“当我从这个cut_and_uncut函数内部打印向量时,一切都正常……当在外部执行时(即在调用该函数的同一级别),它就不正常了。”外部有什么heppens?每当我调用cut_vec[0]时,分割错误,例如,我完全按照你说的做了,但仍然不起作用。实际上,现在在完成填充函数内的向量之前,它会进行分段故障:我不仅更改为
*cut\u part[index]=I
,而且在内存分配期间(
*cut\u part=vecalocl(…)
)。如果我在两个If语句中添加一个print语句,我会看到只处理前7个索引(I=0,…,7),然后它会在您编码的cut_和uncut方法中进行分段,正如我之前写的,我仍然产生了一个分段错误,但是我能够通过一个小的修改使它工作:在使用
*cut\u part=vecalocl(n\u cut)分配内存之后,我做了
long*cut=*cut\u part
,然后在循环内部
cut[index\u cut]=i。通过这些更改,您的答案可以很好地工作。
long *cut_part;
long *uncut_part;

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