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

指针数组(指向指针的指针)复制后运行结果异常求助

解决指针数组复制的异常问题

首先看你给出的代码,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.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 12:29:00