我有一个函数,它获取指向数组的指针作为参数,
例如int** segs
。
我需要为数组分配(在功能体内)内存,例如,大小为100。
我的尝试是:
*segs=(int*)(malloc(100));
到目前为止,一切都很好。
我在
*segs[0]
中输入了一个值,但是一切仍然很好。但是...当我尝试达到
*segs[1]
时,我从valgrind收到“大小为4的无效写入”错误,这将导致seg-fault。我不知道为什么会这样。
我试图达到
*segs[2]
,但后来我什至感到有些奇怪-大小为8的未初始化值的错误。
最佳答案
由于operator precedence,*segs[N]
被视为*(segs[N])
,当N
等于0
时可以。但是,当您使用索引1进行相同的操作时,事情会中断,因为没有为segs[1]
分配任何内容
对于除零以外的任何索引,您需要使用(*segs)[N]
。
在函数中使用临时指针会更容易。
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) { ... }