如何正确使用memcpy而不出现seg故障?

如何正确使用memcpy而不出现seg故障?,c,segmentation-fault,memcpy,C,Segmentation Fault,Memcpy,我目前正在做一个哈夫曼编码程序。我有一个名为huffencode.c的文件,然后通过一个标题链接到下面的主函数encodeFile() 下面的函数makeCodes()使用memcpy在线路上给我一个Seg故障。我在运行gdb时得到一个SIGSEGV,表示\u memcpy\u sse2\u未对齐 函数MaCeCODE()被调用在可以考虑这个文件的主目录中, EnCODE文件()/。我正在传递makeCodes()一个在另一个正常工作的函数中构建的排序链表,一个用于保存当前生成代码的char指针

我目前正在做一个哈夫曼编码程序。我有一个名为huffencode.c的文件,然后通过一个标题链接到下面的主函数encodeFile()

下面的函数makeCodes()使用
memcpy
在线路上给我一个Seg故障。我在运行gdb时得到一个SIGSEGV,表示
\u memcpy\u sse2\u未对齐

函数MaCeCODE()被调用在可以考虑这个文件的主目录中,<代码> EnCODE文件()/<代码>。我正在传递makeCodes()一个在另一个正常工作的函数中构建的排序链表,一个用于保存当前生成代码的char指针,一个用于保存每个符号的代码的symCodes数组,以及huffmanTree的深度

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

为了让代码的版本同时运行,以便我可以一次遍历所有树,我正在尝试malloc内存以获取当前代码的副本,我将copiedCode的大小设置为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);
}

code
是未初始化的指针。第一次使用它时,它会作为参数传递到
makeCodes
,然后泵入
symCodes
表中。
已在堆栈上分配了一个数组。指针只是对内存中某个地方的引用。你必须把它指向已经分配的东西。
–paddy

code
是一个未初始化的指针。第一次使用它时,它会作为参数传递到
makeCodes
,然后泵入
symCodes
表。你认为会发生什么?
code[depth]=2
memcpy(复制代码,代码,255*sizeof(char))。你在哪里初始化代码?哦。。。当时我对指针的理解有点错误。我道歉。那么,一个将被视为数组的指针需要进行malloced,以便它在堆中有空间容纳它?但是已经用指定索引数组[20]初始化的数组不必是malloced?正确的。已在堆栈上分配了一个数组。指针只是对内存中某个地方的引用。你必须把它指向已经分配的东西。
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*/
}