我正在使用malloc分配足够的内存来存储100个字符串*:
string** ptr = (string**)malloc(100*sizeof(string*));
然后我将字符串*值放入每个单元格中:
for(size_t i = 0; i < 100; ++i){
ptr[i*sizeof(string*)] = stringdata[i]; // stringdata is a vector<string*>
}
在上面的for循环中,我没有做ptr [i],因为我理解每个ptr增量总是1个字节,但sizeof(string *)可能超过1个字节。
但是,我见过其他人的代码,他们只使用ptr [i]而没有额外的sizeof(string *)。有谁知道为什么这也没关系?
非常感谢
答案 0 :(得分:3)
看看这个例子:
int i[2] = {0};
int* ptr;
ptr = i; // pointer aims to i[0]
ptr++; // pointer aims to i[1]
ptr被定义为一个int指针。如果sizeof(int)为4,则ptr ++将移动指针4 btyes,因为这是sizeof(int)并且指针是int指针。如果ptr是一个char指针而sizeof(char)是4个字节,则ptr ++只添加1个字节。
答案 1 :(得分:3)
考虑这个例子:
char* cptr = malloc(12);
int* iptr = (int*)cptr;
现在iptr + 1
指向与cptr + 4
相同的内存位置。
对于类型指针,编译器始终计算整个元素,而不是单个字符。
答案 2 :(得分:2)
索引数组时,它总是会添加数组类型的大小。例如,如果我们有一个整数数组
int array[10];
执行array[1]
会将sizeof(int) * 1
添加到基指针array
。因此,如果数组位于地址0x100
(简化),那么array[1]
的地址将为0x104
,如果int
的大小为4。
但是,在您的情况下,您似乎使用的是C ++ std::string
,在这种情况下,我建议使用std::vector
而不是数组。像
std::vector<std::string> strings;
答案 3 :(得分:1)
您不需要将索引乘以sizeof
每个元素!
for(size_t i = 0; i < 100; ++i){
ptr[i] = stringdata[i]; // stringdata is a vector<string*>
}
混合malloc
和new
是一种非常糟糕的方式。在C ++中坚持new
。
string** ptr = new string*[100];
经常 ::operator new
(但并非总是!)正在调用malloc
最后,考虑将std::vector<std::string>
用于ptr
。
答案 4 :(得分:1)
您已将“ptr”声明为“字符串**”。这为编译器提供了足够的信息,当您使用数组索引时,它可以为您计算内存位置。如果你已经将“ptr”声明为“char *”(即一块无法区分的内存),则需要自己进行偏移计算。