gpt4 book ai didi

c - 关于C中Memset的简单问题

转载 作者:行者123 更新时间:2023-11-30 21:15:16 24 4
gpt4 key购买 nike

我是C语言的初学者,请多多包涵;我知道我可以将数组语句设置为 *cc[] ;

我的问题是关于 memset 的:

  char str[] = "hello!";
memset (str,'-',2);
puts (str);

工作正常。但是:

char *str = "hello!";
memset (str,'-',2);
puts (str);

不工作,我知道那个字符 *str = ...是一个普通的数组语句。

如果有人可以帮助我解决这个问题,我谢谢你!

最佳答案

这里的区别很微妙 - 这是字符串的存储位置。

char str[] = "hello!"; 在堆栈上分配一个字符串,该字符串可以更新。

char *str = "hello!"; 在程序 const 数据段中分配一个字符串,并将 str 设置为指向该段。该段无法被操作,并且您的程序会因内存访问冲突而崩溃。

<小时/>

现代计算机具有复杂的内存布局,以及您在某些时候需要学习的一整套概念,例如 Virtual MemoryPaging 例如 StackHeap .

加载到内存中的程序被分成不同的部分,这些部分被加载到具有不同权限的不同页面。代码和全局 const 变量加载到没有写入权限(只能读取)的页面 - 分别是 .text 和 .rodata 段 - 而堆栈和堆分配在可以写入但无法执行的页面上(.text 和 .rodata 段)。数据和.bss)。

第二个示例中的文字字符串“hello”分配在 const 段 (.rodata) 中,因此无法更改。此外,如果你定义了几个这样的字符串

char *s1 = "Hello!";
char *s2 = "Hello!";

很可能s1 == s2为真(地址比较!)

在第一个示例中,在堆栈上分配了一个实际数组,并用包含“hello!\0”的字节(7 个字节)填充。该内存可以被操作,因为它位于分配在可写页面上的堆栈上。

关于c - 关于C中Memset的简单问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47232448/

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