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
相关产品推荐
相关产品推荐

