递增C malloc返回的指针

时间:2013-12-29 11:18:38

标签: c++ malloc

我正在使用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 *)。有谁知道为什么这也没关系?

非常感谢

5 个答案:

答案 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*>
}

混合mallocnew是一种非常糟糕的方式。在C ++中坚持new

string** ptr = new string*[100];
经常

::operator new(但并非总是!)正在调用malloc

最后,考虑将std::vector<std::string>用于ptr

答案 4 :(得分:1)

您已将“ptr”声明为“字符串**”。这为编译器提供了足够的信息,当您使用数组索引时,它可以为您计算内存位置。如果你已经将“ptr”声明为“char *”(即一块无法区分的内存),则需要自己进行偏移计算。