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

如何正确将指针类型字符串变量复制到字符数组变量?

关于用strcpy复制字符串到字符数组的疑问解答

首先贴出你的代码方便讨论:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main( int argc, char **argv ) {
    char *strpointer;
    char strarray[500];
    strpointer = (char*)malloc(500 * sizeof(char));
    strcpy(strpointer, "This a string");
    strcpy(strarray, strpointer);
    printf("strpointer is: %s \n", strpointer);
    printf("strarray is: %s \n", strarray);
    return 0;
}

先给你吃个定心丸:你现在用的方法是完全可行的,程序能正常运行也不是巧合——strcpy的作用就是把源字符串(包括末尾的\0终止符)完整复制到目标内存区域,不管源是堆上的指针(你这里的strpointer)还是栈上的数组,只要目标区域有足够的空间容纳整个字符串,就不会有问题。你的strarray大小是500字节,而源字符串只有十几个字符,完全足够,所以运行起来一切正常。

不过作为C语言新手,有几个潜在的坑需要你提前留意:

  • 缓冲区溢出风险:如果哪天你复制的源字符串长度超过了strarray的大小(比如源字符串有600个字符),strcpy会不管不顾地往目标数组外面写数据,这会破坏栈上的其他内存,轻则程序崩溃,重则引发安全漏洞。解决这个问题的办法是用更安全的字符串复制函数,比如strncpy:

    // 最多复制sizeof(strarray)-1个字符,留一个位置放终止符
    strncpy(strarray, strpointer, sizeof(strarray)-1);
    // 手动添加字符串终止符,因为strncpy如果源过长不会自动加
    strarray[sizeof(strarray)-1] = '\0';
    

    或者复制前先检查源字符串的长度:

    if (strlen(strpointer) < sizeof(strarray)) {
        strcpy(strarray, strpointer);
    } else {
        // 处理字符串过长的情况,比如截断或者报错
        printf("Error: String is too long!\n");
    }
    
  • 内存泄漏问题:你用malloc给strpointer分配了堆内存,但程序结束前没有调用free(strpointer);释放它。虽然程序退出后操作系统会回收这块内存,但在大型、长期运行的程序里,这种未释放的内存会越积越多,最终导致内存耗尽。所以养成好习惯,在不再需要strpointer的时候(比如复制完成后)加上free(strpointer);。

总的来说,你当前的代码没有问题,但上面提到的这些细节是C语言里很重要的知识点,提前掌握能帮你避开很多后续的麻烦。

内容的提问来源于stack exchange,提问作者Sopalajo de Arrierez

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 22:52:45