填写作为指针传递的向量(C)
假设我有一个逻辑数组,我想把它分成1部分和0部分,创建两个独立的向量 所以我想出了以下方法:填写作为指针传递的向量(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
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, ...)