此代码生成“p = hello world”:
#include "stdio.h"
#include "string.h"
int main(){
char *p;
p="hello world";
printf("p is %s \n",p);
return 0;
}
但是这段代码会产生一个段错误:
#include "stdio.h"
#include "string.h"
int main() {
char *p;
strcpy(p,"hello");
printf("p is %s \n",p);
return 0;
}
这段代码产生“p = hello”
#include "stdio.h"
#include "string.h"
#include "stdlib.h"
int main() {
char *p;
p=(char*)malloc (10);
strcpy(p,"hello");
printf("p is %s \n",p);
return 0;
最佳答案
在 p="hello world";
的情况下(本次编辑时的第一种情况),p
被初始化为指向 包含字符串“hello world”(字符串文字)的只读内存区域。此只读内存区域是在编译时创建的。
在导致段错误的情况下(本次编辑时的第 2 种情况),p
未初始化,向其复制任何内容将产生不可预知的结果,因为 在内存中的位置p
指向的不是代码指定的。
在将字符串复制到p
之前,您必须指定p
指向的内存。
你可以在栈上分配这 block 内存
char buf[BUFSIZ] = "";/* 局部变量 */
在堆上
char *buf = malloc(BUFSIZ);/* 不要忘记释放 */
或在 __DATA 段中。
static char buf[BUFSIZ] = "";/* 全局变量 */
然后您可以初始化 p
以指向内存缓冲区。
char *p = buf;
这在概念上类似于初始化 p
以指向只读 内存中的字符串文字。与 p
指向字符串文字的情况不同,您现在可以将字符串复制到字符指针,因为它不指向只读内存。
注意:我特意创建了一个单独的缓冲区并初始化了 p
以指向它以帮助说明我的观点。
关于c - 为什么我们不能将字符串复制到字符指针,而我们可以直接将字符串分配给它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2222596/