指针数组(指向指针的指针)复制后运行结果异常求助
解决指针数组复制的异常问题
首先看你给出的代码,mycopy函数的循环逻辑没写完,而且要正确复制指针数组,得分浅复制和深复制两种情况,不同场景对应不同的实现方式,我来帮你逐个分析并修正:
问题分析
你的代码里o是指向字符串字面量的指针数组,如果你只是简单复制指针,其实不会有异常,但如果想把每个字符串的内容也复制一份(深复制),就需要给每个新指针分配内存,再把字符串内容拷贝过去——你的alloc函数应该是用来做内存分配的,但没实现,这大概率是导致异常的核心原因。
方案1:浅复制(仅复制指针)
如果不需要修改字符串内容,只是让新数组的指针指向原字符串,这种实现最简单:
#include<stdio.h> #include<string.h> #pragma warning(disable:4996) void mycopy(char *c[], char *o[], int olen); int main() { char *o[] = { "12", "13", "14" }; char *c[3]; mycopy(c, o, 3); for (int i = 0; i < 3; i++) { printf("原数组元素:%s\n", o[i]); printf("复制后元素:%s\n", c[i]); } return 0; } void mycopy(char *c[], char *o[], int olen) { for (int i = 0; i < olen; i++) { // 直接复制指针,两个指针指向同一块内存(字符串字面量) c[i] = o[i]; } }
注意:字符串字面量是只读的,如果你后续尝试修改c[i]指向的内容,会触发未定义行为(比如程序崩溃)。
方案2:深复制(复制字符串内容)
如果需要独立的字符串副本,就需要为每个元素分配内存,再拷贝内容。这里我帮你实现alloc函数(或者直接用malloc也可以):
#include<stdio.h> #include<string.h> #include<stdlib.h> // 引入malloc/free的头文件 #pragma warning(disable:4996) void mycopy(char *c[], char *o[], int olen); char *alloc(int n); int main() { char *o[] = { "12", "13", "14" }; char *c[3]; mycopy(c, o, 3); for (int i = 0; i < 3; i++) { printf("原数组元素:%s\n", o[i]); printf("复制后元素:%s\n", c[i]); } // 记得释放深复制分配的内存,避免内存泄漏 for (int i = 0; i < 3; i++) { free(c[i]); } return 0; } void mycopy(char *c[], char *o[], int olen) { for (int i = 0; i < olen; i++) { int len = strlen(o[i]) + 1; // +1是为了存储字符串结束符'\0' c[i] = alloc(len); // 分配内存 if (c[i] == NULL) { // 检查内存分配是否成功 printf("内存分配失败!\n"); exit(1); } strcpy(c[i], o[i]); // 拷贝字符串内容 } } // 实现alloc函数,本质是封装malloc char *alloc(int n) { return (char*)malloc(n * sizeof(char)); }
这种方式下,c数组的每个指针都指向独立的内存块,修改c[i]的内容不会影响原数组o,但一定要记得用完后释放内存,避免内存泄漏。
为什么你原来的代码会异常?
你的mycopy函数循环未完成,而且如果没分配内存就直接拷贝字符串,会导致野指针或者内存访问越界,触发程序异常。另外,如果alloc函数没实现就调用,也会导致未定义行为。
内容的提问来源于stack exchange,提问作者Me.
相关产品推荐
相关产品推荐

