我有一个函数,它获取一个指向数组的指针作为参数,例如CCD_ 1。我需要为数组分配(在函数体中(内存,例如,数组的大小为100。我的尝试是:
*segs=(int*)(malloc(100));
到目前为止还不错。我给*segs[0]
加了一个值,但仍然一切都很好。但是当我试图到达*segs[1]
时,我从valgrind得到一个"大小为4的无效写入"错误,这导致了seg故障。我不知道为什么会发生这种事。我试着联系*segs[2]
,但后来我得到了更奇怪的东西——
大小为8的未初始化值的错误。
由于运算符的优先级,*segs[N]
被视为*(segs[N])
,当N
等于0
时,这是可以的。然而,当您使用索引1执行相同的操作时,由于没有为segs[1]
分配任何内容,因此情况会中断
对于除零以外的任何索引,都需要使用int** segs
0。
在函数中使用临时指针会更容易。
int* ptr = (int*)(malloc(100));
*segs = ptr;
// and then
ptr[0] = ...; // Good
ptr[1] = ...; // Good
...
ptr[99] = ...; // Still good
升级到C++方式
通过引用传递指针。
void foo(int*& segs) { ... }
使用
new
而不是malloc
来分配内存。segs = new int[100];
更好的是,使用
std::vector
不稳定的原始数组。void foo(std::vector<int>& segs) { ... }