You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

编译C语言循环队列扩容代码时遇undefined reference to copy错误求助

关于C语言循环队列代码中copy函数未定义的问题解答

问题背景

一段实现循环队列容量翻倍功能的C代码(来自《C语言数据结构基础》)编译时出现错误:undefined reference to copy,需要明确该函数所属标准库或找到替代方案。

问题分析

C标准库中不存在名为copy的函数,这个函数大概率是教材作者自定义的,或是误将C++标准库的std::copy直接用到了C代码中。

替代解决办法

办法1:使用C标准库的memcpy函数

这是最简便的方案,memcpy是C标准库中用于内存块拷贝的函数,需要先包含头文件<string.h>。

memcpy的使用格式:

memcpy(void *dest, const void *src, size_t n);
  • dest:目标内存地址
  • src:源内存地址
  • n:需要拷贝的字节总数

将原代码中所有copy调用替换为memcpy,并计算正确的字节数(元素个数 × 单个元素大小):原代码中的copy调用是左闭右开区间[start, end),元素个数为end - start,因此字节数为(end - start) * sizeof(element)。

修改后的queueFull函数关键代码:

#include <string.h> // 新增头文件

void queueFull() {
  int start;
  element *newQueue;
  // 修正malloc的大小计算:sizeof(queue)是指针大小,应该用sizeof(element)
  newQueue = (element*) malloc(2 * capacity * sizeof(element));
  /*Copy from queue to newQueue*/
  start = (f + 1) % capacity;
  if (start < 2) {
    /*No wrap around*/
    memcpy(newQueue, queue + start, (capacity - start) * sizeof(element));
  } else {
    memcpy(newQueue, queue + start, (capacity - start) * sizeof(element));
    memcpy(newQueue + capacity - start, queue, (r + 1) * sizeof(element));
  }
  /*Switch to newqueue*/
  f = 2 * capacity - 1;
  r = capacity - 1;
  capacity *= 2;
  free(queue);
  queue = newQueue;
}

办法2:自定义copy函数

如果想保留原代码的调用风格,可以自己实现一个模拟std::copy行为的copy函数:

void copy(element *src_start, element *src_end, element *dest) {
  while (src_start < src_end) {
    *dest++ = *src_start++;
  }
}

将这个函数添加到代码中,就能直接兼容原有的copy调用。

额外修正提示

原代码中malloc的参数存在错误:

newQueue = (element*) malloc(2 * capacity * sizeof(queue));

sizeof(queue)得到的是指针类型的大小(通常4或8字节),而不是element结构体的大小,应该改为sizeof(element),否则会导致内存分配不足,运行时出现错误。


内容的提问来源于stack exchange,提问作者Yoga Simha Vykuntam

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 04:45:43