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

如何在C语言中不使用动态内存完成数组重新赋值?

C语言数组指针赋值问题解决方案

错误原因

  • C语言函数参数采用值传递规则:你在reasi函数内对形参a赋值,修改的只是实参退化为指针后的副本,不会影响外部数组的实际内容。
  • 直接把局部数组x的首地址赋值给指针是无效操作:x是栈区局部数组,函数执行结束后栈空间被回收,即使能把x的地址传回主函数,也会变成悬空指针,触发未定义行为。

无动态内存分配的正确实现

你在main函数中定义的是char*类型数组,每个元素存储的是字符串常量的首地址,只需逐个修改数组元素的指针指向即可,不需要额外申请动态内存:

#include <stdio.h>

void reasi(char* a[], int len) {
    char* x[] = {"1", "22", "333"};
    for (int i = 0; i < len; i++) {
        a[i] = x[i];
    }
}

int main() {
    char* a[] = {"bob", "alice", "tom"};
    int len = sizeof(a) / sizeof(a[0]);
    reasi(a, len);
    for (int i = 0; i < len; i++) {
        printf("%s\n", a[i]);
    }
    return 0;
}

运行后会输出你期望的1、22、333结果。

注意:这里赋值的是x数组中存储的字符串常量地址,字符串常量存储在程序静态存储区,生命周期和程序一致,所以即使局部数组x被回收,赋值后的指针依然有效,不会出现悬空问题。

可选扩展实现(固定长度数组场景)

如果你的数组长度固定,也可以传入数组指针直接操作,写法如下(灵活性较低,仅作参考):

#include <stdio.h>

void reasi(char* (*a)[3]) {
    char* x[] = {"1", "22", "333"};
    for (int i = 0; i < 3; i++) {
        (*a)[i] = x[i];
    }
}

int main() {
    char* a[] = {"bob", "alice", "tom"};
    reasi(&a);
    for (int i = 0; i < 3; i++) {
        printf("%s\n", a[i]);
    }
    return 0;
}

内容的提问来源于stack exchange,提问作者SadSalad

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 03:21:03