在C语言中,“duplicate”通常指复制或重复数据,可能涉及字符串、数组、结构体或文件等场景,以下是常见场景的实现方法和注意事项:

(图片来源网络,侵删)
字符串复制(strcpy vs strdup)
方法1:使用 strcpy(需手动分配内存)
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main() {
char src[] = "Hello, World!";
char *dest = (char *)malloc(strlen(src) + 1); // 分配内存(+1用于'\0')
if (dest == NULL) {
perror("Memory allocation failed");
return 1;
}
strcpy(dest, src); // 复制字符串
printf("Copied: %s\n", dest);
free(dest); // 释放内存
return 0;
}
方法2:使用 strdup(自动分配内存)
#include <stdio.h>
#include <string.h>
int main() {
char src[] = "Hello, World!";
char *dest = strdup(src); // 自动分配内存并复制
if (dest == NULL) {
perror("strdup failed");
return 1;
}
printf("Duplicated: %s\n", dest);
free(dest); // 必须手动释放
return 0;
}
注意:strdup 是 POSIX 标准,Windows 下需用 _strdup。
数组复制
一维数组
int src[] = {1, 2, 3, 4, 5};
int *dest = (int *)malloc(sizeof(src)); // 分配相同大小的内存
memcpy(dest, src, sizeof(src)); // 按字节复制
二维数组
int src[2][3] = {{1, 2, 3}, {4, 5, 6}};
int (*dest)[3] = malloc(2 * sizeof(*dest)); // 分配行数
memcpy(dest, src, sizeof(src));
结构体复制
浅拷贝(直接赋值)
struct Point {
int x, y;
};
int main() {
struct Point p1 = {10, 20};
struct Point p2 = p1; // 直接复制
printf("p2: (%d, %d)\n", p2.x, p2.y);
return 0;
}
深拷贝(手动复制动态成员)
struct Person {
char *name;
int age;
};
int main() {
struct Person p1;
p1.name = strdup("Alice"); // 动态分配内存
p1.age = 30;
struct Person p2;
p2.name = strdup(p1.name); // 复制字符串
p2.age = p1.age;
free(p1.name);
free(p2.name);
return 0;
}
文件复制
#include <stdio.h>
int main() {
FILE *src = fopen("source.txt", "rb");
FILE *dest = fopen("dest.txt", "wb");
if (!src || !dest) {
perror("File open failed");
return 1;
}
char buffer[4096];
size_t bytes;
while ((bytes = fread(buffer, 1, sizeof(buffer), src)) > 0) {
fwrite(buffer, 1, bytes, dest);
}
fclose(src);
fclose(dest);
return 0;
}
检测重复数据
字符串数组去重
#include <stdio.h>
#include <string.h>
int main() {
char *arr[] = {"apple", "banana", "apple", "orange", "banana"};
int n = 5;
for (int i = 0; i < n; i++) {
for (int j = i + 1; j < n; j++) {
if (strcmp(arr[i], arr[j]) == 0) {
printf("Duplicate found: %s\n", arr[i]);
break;
}
}
}
return 0;
}
关键注意事项
- 内存管理:
- 使用
malloc/strdup后必须free,避免内存泄漏。 - 确保目标缓冲区足够大(如
strcpy需预留'\0'空间)。
- 使用
- 深拷贝 vs 浅拷贝:
- 浅拷贝仅复制指针,可能导致双重释放或悬挂指针。
- 深拷贝复制实际数据,适用于动态分配的结构体。
- 安全性:
- 避免使用
gets等不安全的函数,改用fgets。 - 检查
malloc返回值是否为NULL。
- 避免使用
根据具体场景选择合适的复制方法,并始终注意内存安全!

(图片来源网络,侵删)
