复制指针时 memcpy() 未按预期工作
memcpy() not working as expected when copying pointers
我想将char **pointer
的内容复制到另一个指针。我的尝试是:
void test(char **arr, int len) {
printf("1: ");
printArr(arr, len);
char ***res = malloc(sizeof(char **));
res[0] = malloc(sizeof(char *) * len);
memcpy(&res[0], arr, len);
printArr(res[0], len);
这里我只是想将包含多个字符串的arr
的内容复制到r[0]
,其中len
表示arr
中的元素数。但是,在检查 res[0]
时,我意识到它只存储了两次 null。可以看出我是一个非常初学者,几天以来一直在学习 C,所以可以预料到简单的错误。
char ***res = malloc(sizeof(char **));
res[0] = malloc(sizeof(char *) * len);
memcpy(&res[0], arr, len);
第一行为单个 char **
分配 space 并使 res
指向它
第二行为 len
指向 char
的数组分配 space 并使 res[0]
指向它。
第三行从 arr 复制 len byes 到 res
指向的内存顶部,覆盖第二次 malloc 调用的结果,然后在第一次 malloc 调用分配的块之后涂写内存.
你可能真的想要这样的东西
mempy(res[0], arr, len * sizeof(char*));
这会将 len
个指针数组(由 arr 指向)复制到第二个 malloc 调用分配的内存中。
如果这是您需要的 C 字符串数组深度复制:
char** array_deep_copy(char **arr, int len) {
// calloc() makes "allocation of N" calculations more clear
// that this is N allocations of char* becoming char**
char **res = calloc(len, sizeof(char*));
for (int i = 0; i < len; ++i) {
// Use strdup() if available
res[i] = strdup(arr[i]);
}
return res;
}
请注意,这需要一个适当的释放函数,该函数将递归地 free()
那些克隆的字符串或此 泄漏内存 。
如果只需要浅拷贝:
char** array_shallow_copy(char **arr, int len) {
char **res = calloc(len, sizeof(char*));
// memcpy(dest, src, size) is usually more efficient than a loop
memcpy(res, arr, sizeof(char*) * len);
return res;
}
这个不需要递归 free()
,您只需 free()
顶级指针即可。这个与原来的共享数据,所以如果 any 这些指针在这个结构被释放之前被释放,那么你将在其中有无效的指针。小心!
我想将char **pointer
的内容复制到另一个指针。我的尝试是:
void test(char **arr, int len) {
printf("1: ");
printArr(arr, len);
char ***res = malloc(sizeof(char **));
res[0] = malloc(sizeof(char *) * len);
memcpy(&res[0], arr, len);
printArr(res[0], len);
这里我只是想将包含多个字符串的arr
的内容复制到r[0]
,其中len
表示arr
中的元素数。但是,在检查 res[0]
时,我意识到它只存储了两次 null。可以看出我是一个非常初学者,几天以来一直在学习 C,所以可以预料到简单的错误。
char ***res = malloc(sizeof(char **));
res[0] = malloc(sizeof(char *) * len);
memcpy(&res[0], arr, len);
第一行为单个 char **
分配 space 并使 res
指向它
第二行为 len
指向 char
的数组分配 space 并使 res[0]
指向它。
第三行从 arr 复制 len byes 到 res
指向的内存顶部,覆盖第二次 malloc 调用的结果,然后在第一次 malloc 调用分配的块之后涂写内存.
你可能真的想要这样的东西
mempy(res[0], arr, len * sizeof(char*));
这会将 len
个指针数组(由 arr 指向)复制到第二个 malloc 调用分配的内存中。
如果这是您需要的 C 字符串数组深度复制:
char** array_deep_copy(char **arr, int len) {
// calloc() makes "allocation of N" calculations more clear
// that this is N allocations of char* becoming char**
char **res = calloc(len, sizeof(char*));
for (int i = 0; i < len; ++i) {
// Use strdup() if available
res[i] = strdup(arr[i]);
}
return res;
}
请注意,这需要一个适当的释放函数,该函数将递归地 free()
那些克隆的字符串或此 泄漏内存 。
如果只需要浅拷贝:
char** array_shallow_copy(char **arr, int len) {
char **res = calloc(len, sizeof(char*));
// memcpy(dest, src, size) is usually more efficient than a loop
memcpy(res, arr, sizeof(char*) * len);
return res;
}
这个不需要递归 free()
,您只需 free()
顶级指针即可。这个与原来的共享数据,所以如果 any 这些指针在这个结构被释放之前被释放,那么你将在其中有无效的指针。小心!