【问题标题】:c/c++ questions on pointers (double pointers)c/c++ 关于指针的问题(双指针)
【发布时间】:2014-05-13 03:28:26
【问题描述】:

自从我学习 c 和 c++ 课程以来已经有一段时间了,我对 c 指针很好奇(我打算在我的示例中使用 new 关键字,即使我知道 malloc 是 C 方式)。我总是记得我的老师总是强迫我们使用指针,她永远不会对数组进行赋值,她向我们证明,当你使用指针而不是使用数组时,汇编语言中需要的命令更少。我想继续这种良好的做法,但我似乎在努力使用指针,特别是双指针。

假设我想在不使用 c++ 字符串数据类型的情况下创建一个单词库,并且我有一个 char 类型的双指针。

int main()
{
   string fileName = "file.txt";
   char** wordBank = null;
   int wordCount = countWords(fileName); //somefunction to get word count
}

现在我需要为整个银行分配足够大的内存空间但我不确定如何执行此操作我相信它是这样的?

wordBank = new char*[wordCount];

现在我需要为每个单词的大小专门分配空间,我仍然不确定。

for(int i = 0; i < wordCount; i++)
{
   wordLength = getWordLength(fileName, i); // some function to get word length of each...
   //... word in the bank
   (*wordBank) = new char[wordLength];
}

好吧,我感到困惑的最后一部分是通过函数传递双指针。 假设我有一个函数可以让我操纵整个单词,假设我只想传递单词,我将通过函数调用传递什么以及函数定义将具有什么。假设我想传递整个银行和一个将移动指针的数字,我将通过函数调用传递什么以及函数定义将具有什么。很抱歉通常会出现所有问题如果我尝试通过编写短程序自己回答这些问题,但我很难让它编译。感谢收到的回复。

【问题讨论】:

  • 我尽量避免混用*[]
  • wordBank[i] = new char[wordLength] ?
  • 我知道您在问题中说过您不想这样做,但如果您使用的是 C++(如 new 关键字所示),那么我真的会强烈推荐使用std::string。在这种情况下没有充分的理由不这样做。它会为您处理所有的内存管理,您不必担心 nul 终止符,而且它的效率不会低于自己进行所有分配和复制。您的wordBank 数组也可以作为std::vector&lt;std::string&gt; 更好。同样,它的效率并没有降低,但使用起来更容易、更安全。
  • 更少的命令并不一定意味着更好的性能。查找“过早优化”。我不认为这个概念是好的做法,而是相反。相信我,当您在任何地方使用 newmalloc 时,您将花费更多的时间来担心您的程序出了什么问题,而不是实际节省的性能。

标签: c++ c pointers double


【解决方案1】:

分配银行:

wordBank = malloc(wordCount * sizeof(char *));

分配单个单词:

char *addWord(char **wordBank, size_t idx, char *word) {
  wordBank[idx] = malloc(strlen(word) + 1);
  // this is how you pass a word
  strcpy(wordBank[idx], word);
  return wordBank[idx];
}

// how you pass the wordBank:
addWord(wordBand, index, someWord);

但是在程序集中有更多的指令并不一定是坏事。恒定的开销在编程中通常不是问题。我会使用std::stringstd::vector&lt;string&gt; 并把时间花在真正的问题上。至少在调试 malloc 和 free、分配和测试 NULL 指针方面没有。

【讨论】:

  • 阿门使用 std::stringstd::vector&lt;std::string&gt;... 但在你的例子中使用 new 而不是 malloc 不是更好吗?
  • 在 C++ 中可能更好,但使用 new/delete 甚至没有意义 :)
  • 如果你有 Posix,那么 wordBank[i] = strdup(word) 会短一些
  • 我可以给最后一段额外的投票吗? :)
  • +1 表示最后一段。此外,数组和指针访问在汇编语言中的区别往往是简单的算术。即使代码确实需要优化,它通常需要更改缓存未命中和/或不可预测的条件分支才能产生很大的不同。
【解决方案2】:

我的看法:

wordBank = new char*[wordCount];

这很好:您正在分配 wordCount 元素的数组 char*

for(int i = 0; i < wordCount; i++)
{
   wordLength = getWordLength(fileName, i); // some function to get word length of each...
   //... word in the bank
   wordBank[i] = new char[wordLength];
}

正如 cmets (@angdev) 中所指出的,我们需要为数组中的每个项目(char *)分配内存。

需要注意的一点是,您必须记住在完成后释放该内存......并且您应该使用正确的操作来释放您所做的分配:

  • 如果你使用malloc() ---> 使用free()
  • 如果你使用new ---> 使用删除`
  • 如果你使用new [] ---> 使用delete []`

最后,如果需要修改函数内部的指针,请使用对指针的引用:

char *myPointer=0;

fillIt(myPointer);

所以...如果你想让fillIt() 实际修改myPointer 指向的位置,函数应该是:

void fillIt(char * & p) { ... }

或者,您可以将其定义为:

void fillIt(char ** p) { ... }

并将其调用为

char *myPointer=0;

fillIt(&myPointer);

【讨论】:

    猜你喜欢
    • 2023-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-01
    • 2022-01-05
    • 2017-08-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多