假设我有这个逻辑数组,我想分成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);
两个整数(len
和len2
)已正确填充,但当我尝试查看cut_vec
和uncut_vec
向量时,会发生段错误。
我有预感,我正在对内存做错了,因为我初始化了两个指针而没有实际指向任何东西..但是在函数中,使用实际的vecallocl,它们应该正确初始化。
当我从这个cut_and_uncut
函数内部打印向量时,一切都有效..当在外面进行时(即在同一级别调用此函数),它不会。
怎么了?
答案 0 :(得分: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()
返回后将保留修改。