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

char *p与char p[]的区别:两段strcpy代码为何一运行一失效?

char *p 和 char p[] 的区别及代码问题解析

一、char *p 和 char p[] 的核心区别

  • char p[](字符数组):
    这是数组类型,声明时会在栈上分配固定大小的内存空间。如果用字符串初始化(比如char p[] = "abc"),编译器会自动分配「字符串长度+1」的空间(多出来的1字节用于存储字符串结束符\0)。数组名是常量指针,指向固定,永远指向数组首元素,不能修改它的指向(比如p++属于非法操作)。
  • char *p(字符指针):
    这是指针变量,仅在栈上占用一个指针大小的内存(通常4/8字节,取决于系统位数),它本身不存储字符串内容,只是用来指向一块内存地址。指针的指向可以随时修改(比如p = "def"或者p = &some_char都是合法操作)。

二、两段代码的问题分析

第一段代码(char target[0])

#include<stdio.h>
#include<string.h>

void main()
{
    char source[]="stackflow";
    char target[0];
    strcpy(target,source);
    printf("%s", target);
}

这里声明了一个长度为0的数组,栈上给它分配的内存空间为0字节。strcpy需要把source里的10字节内容("stackflow"是9个字符加\0)复制到target,直接造成严重的栈内存越界,属于未定义行为。运行时会破坏栈上其他数据,大概率导致程序崩溃,所以无法正常运行。

第二段代码(char *target)

#include<stdio.h>
#include<string.h>

void main()
{
    char source[]="stackflow";
    char *target;
    strcpy(target,source);
    printf("%s", target);
}

这里的target是未初始化的指针,它的指向是随机内存地址。strcpy把内容复制到这个随机地址时,运气好的话该地址恰好是可写区域,程序可能暂时能打印内容,但这绝对不是“正常运行”——这依然是未定义行为。如果随机指向只读内存、系统内存或其他程序内存,会立刻触发崩溃,或悄悄破坏数据引发后续异常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 17:47:06