如何正确使用 memcpy 而不会出现段错误?

How do I properly use memcpy without getting seg faults?

我目前正在研究霍夫曼编码程序。我有一个名为 huffencode.c 的文件,然后通过下面作为我的主要函数 encodeFile() 的 header 进行链接。

下面的函数 makeCodes() 在使用 memcpy 的行上给我一个段错误。当我 运行 gdb 时我得到一个 SIGSEGV,说 __memcpy_sse2_unaligned

正在调用函数 makeCodes(),您可以将其视为此文件的主要部分,encodeFile()。我正在向 makeCodes() 传递一个排序链表,该链表内置于另一个运行良好的函数中,一个 char 指针用于保存当前生成的代码,一个 symCodes 数组用于保存每个符号的代码,以及 huffmanTree 的深度.

makeCodes() 应该按照 huffman cdoing 算法的预期工作,如果当前节点不是叶子,我向左横向添加代码 0,向右横向添加代码 1。如果节点是一片叶子,我到达了一个符号,我当前对该符号的代码已经完成,我可以通过节点符号将该代码添加到正确的位置。

为了让代码的多个版本同时运行以便我可以一次遍历树,我正在尝试 malloc 内存以获取当前代码的副本,并且我有复制代码的大小设置为 255 * size(char) 因为一个代码只能是 255 位的长度。然后我尝试将代码复制到复制的代码中,长度可能是最大的。我的错误就在这里。

如有任何提示,我们将不胜感激。

 struct HuffmanTreeNode
 {
   char symbol;
   unsigned long freq;
   char code[256];
   struct HuffmanTreeNode *left, *right;
   struct HuffmanTreeNode* next;
 };   
 void makeCodes(
 struct HuffmanTreeNode *node,        /* Pointer to some tree node */
 char *code,          /* The *current* code in progress */
 char *symCodes[256], /* The array to hold the codes for all the symbols */
 int depth)           /* How deep in the tree we are (code length) */
{
 printf("Test");
 char *copiedCode;
 int i;

 if(isLeaf(node))
 {
  code[depth] = 2;
  for(i = 0; i < depth; i++)
  {
     symCodes[node->symbol] = code;
  }
 }

 copiedCode = (char *) malloc(255*sizeof(char));
 memcpy(copiedCode, code, 255*sizeof(char));

 code[depth] = 0;
 makeCodes(node->left, code, symCodes, depth+1);

 copiedCode[depth] = 1;
 makeCodes(node->right, copiedCode, symCodes, depth+1);
 free(copiedCode);
}

我主要调用这个函数,这里唯一重要的是我 makeCodes() 的变量和调用函数 makeCodes:

void encodeFile(FILE* in, FILE* out)
{
  int top = 0;
  int i;
  char *code;
  char *symCodes[256] = {0};
  int depth = 0;

  getFileFreq(in, out);
  buildSortedList();
  printCodes(buildHuffmanTree(globalSortedLL), globalUsedCh, top);
  makeCodes(buildHuffmanTree(globalSortedLL), code, symCodes, depth);

  /*test stuff
  struct HuffmanTreeNode* tree;
  tree = newNode('Q', 1);

  insert(tree, 'A', 5);
  insert(tree, 'b', 12);
  insert(tree, 'd', 4);
  insert(tree, 'l', 6);
  insert(tree, 'e', 2);
  insert(tree, 'f', 3);
  insert(tree, 'h', 7);

  printf("Test tree: ");
  printList(tree);
  end of test stuff*/
}

code 是一个未初始化的指针。第一次使用它时,它会作为参数传递给 makeCodes,然后注入到您的 symCodes table.
堆栈上已经分配了一个数组。指针只是对内存中某处的引用。您必须将其指向已分配的内容。 – 稻田