gpt4 book ai didi

c - 为什么我们不能将字符串复制到字符指针,而我们可以直接将字符串分配给它?

转载 作者:太空狗 更新时间:2023-10-29 17:27:20 24 4
gpt4 key购买 nike

此代码生成“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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com