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

标签 c pointers

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

相关文章:

c - union 成员初始化问题

c - 以下 C 代码段的输出是什么?

c++ - 如何: derived member in derived class with derived class specific methods

c - 指针和cstring初学者的烦恼

c - AES EVP_Decrypt的 "length"参数是什么?

c - 我如何正确地使这个循环显示斐波那契数列的前 40 位数字?

c - 删除字符串的子字符串

c - 取消引用和类型转换

c - 从不兼容的指针类型传递

c++ - 使用类指针与实例