【问题标题】:incrementing pointer returned by C mallocC malloc 返回的递增指针
【发布时间】:2013-12-29 11:18:38
【问题描述】:

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

非常感谢

【问题讨论】:

  • 请问string 是什么?还是应该是你在做 C++ 而不是 C?
  • 抱歉,是的,我使用 C malloc 但用于 C++ 程序。谢谢
  • 你说的是std::string吗?如果是这样,您不应该使用new 吗?据我所知,这是一个对象
  • 如果你使用std::string,使用来存储!
  • 你应该解释为什么你真的需要使用malloc。这可能是一个非常糟糕的想法。

标签: c++ malloc


【解决方案1】:

看这个例子:

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 个字节,因为这是 sizeof(int) 并且指针是 int 指针。如果 ptr 是一个 char 指针并且 sizeof(char) 是 4 个字节,那么 ptr++ 只添加 1 个字节。

【讨论】:

  • 非常感谢!另一个相关的问题是,如果我有 (void**) ptr = (void**)malloc(100*sizeof(void*)),我似乎无法在 void** 上进行指针运算。在这种情况下,我倾向于直接使用内存地址(即将 void** 转换为 size_t 以获得绝对内存地址,然后添加所需的字节数)。但是这种方法似乎很“低级”,有没有更好的方法?谢谢
【解决方案2】:

考虑这个例子:

char* cptr = malloc(12);
int* iptr = (int*)cptr;

现在iptr + 1 指向与cptr + 4 相同的内存位置。

对于类型化指针,编译器总是计算整个元素,而不是单个字符。

【讨论】:

    【解决方案3】:

    当索引一个数组时,它总是会添加数组类型的大小。例如,如果我们有一个整数数组

    int array[10];
    

    执行array[1] 会将sizeof(int) * 1 添加到基指针array。因此,如果数组位于地址0x100(简化)上,那么如果int 的大小为4,则array[1] 的地址将为0x104


    但是,在您的情况下,您似乎正在使用 C++ std::string,在这种情况下,我建议使用 std::vector 而不是数组。喜欢

    std::vector<std::string> strings;
    

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

        您不需要将索引乘以 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&lt;std::string&gt; 用于ptr

        【讨论】:

        • 我会建议他使用 vector 而不是他做的烂摊子
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-11-10
        • 2014-09-25
        • 2014-08-16
        • 2010-09-23
        • 2017-01-05
        • 1970-01-01
        • 2011-09-23
        相关资源
        最近更新 更多