首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >尝试使用strcpy时获取核心转储错误

尝试使用strcpy时获取核心转储错误
EN

Stack Overflow用户
提问于 2019-11-27 15:16:42
回答 2查看 321关注 0票数 0

首先,我想知道为什么案例1会给我核心转储错误。第二,我想知道我的心态是否正确。

所以我创建了2种情况,在第一种情况下,当我执行时,我得到一个核心转储消息,程序退出。

另一个案子开始了,我看到了结果。

代码语言:javascript
复制
    //case 1
    //'word' is not initialized properly,or by using malloc or calloc
    //as a result 'word' content will not change when you i use strcpy to copy over it
    char * word = "hello";
    printf("%s\n",word);
    strcpy(word,"world");
    printf("%s\n",word);

    //case 2
    //this case works because I create a static variable word with size 20
    //and everytime I change it, The compiler knows where to find it in the stack.
    char  word[20] = "";
    char * word2 = "yolo";
    strcpy(word,"hello");

    printf("%s\n",word); //prints hello as expected
    strcpy(word,word2); //copies yolo to word
    printf("%s\n",word); // prints yolo
   //hence strcpy does not change the reference
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-11-27 15:25:58

//案件1 “‘word”未正确初始化,或使用malloc或calloc

word指针是用字符串文字 "helllo"的第一个字符的地址正确初始化的。

因此,当您使用strcpy对其进行复制时,“word”内容不会更改。

因此,word指针指向不可修改的内存,并且不能修改内存。修改word指向的内存的内容会导致程序的未定义行为

strcpy(单词,"world")

修改指针word指向的内存。根据C. strcpy试图写入“只读”内存或系统不允许程序写入的内存,这会导致未定义的行为--在大多数系统上,这会导致分段故障,这实际上是与访问受限内存区域相关的失败条件。

//案件2 本例之所以有效,是因为我创建了一个大小为20的静态变量字。

在C中,静态关键字(最常见)与创建具有静态存储时间的变量相关联--这在这里并不重要。定义char word[20]告诉编译器为20 char分配存储,这样的定义创建了可以修改的存储。这种声明是否与关键字static一起使用并不重要,存储可以通过word进行修改。

每次我更改它时,编译器都知道在堆栈中找到它的位置。

嗯..。编译器很可能总是知道在堆栈上找到它的位置-- word数组的地址。&word -不会改变。在strcpy(word,"hello");中,您可以更改数组的内容,即使用word数组分配的内存,而不是数组位置。

票数 1
EN

Stack Overflow用户

发布于 2019-11-27 15:41:21

使用char * word = "hello";,您已经将字符串定义为指向字符的指针,该指针由字符串文本初始化。字符串文本存储在内存的只读部分,实际上是常量。

该值存储在二进制文件中的只读部分中,无法修改.如果编译到程序集文件(使用gcc中的-S编译器选项),则可以在.rodata部分看到字符串文本。在这种情况下,rodata意味着“只读数据”。

虽然字符串文本是只读的,但是您可以通过将它指向不同的字符串文本来修改char *

代码语言:javascript
复制
char *word = "hello";
// Redefine the char pointer
word = "world";

这个重新分配是可以的-您将在程序集文件中看到两个字符串文本。在这种情况下,您不能使用strcpy()复制到word,因为它是不可变的。

在第2种情况下,将字符串声明为字符数组char word[20]。您正在声明一个空的"string“(实际上是一个char数组),其中包含20个字符的空格。将word2 (字符串文本)复制到word中是可行的,因为在本例中,word被声明为字符数组,因此是可变的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59073311

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档