编译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
相关产品推荐
相关产品推荐

