c – char * blah =“你好”如何运作?

c – char * blah =“你好”如何运作?,第1张

概述当你用char指针创建一个字符串时,它是如何工作的? char *name = "ben"; 这是’隐藏’指针算术吗? 没有任何隐藏的指针算术,但我怀疑你想要一个更详细的答案. 如果你有一个功能: void foo() { char * bar = "Hello World";} 实际上有两个内存块可供使用: >第一个是12个字节用于存储“Hello World”的位置(每个字母1个字节 当你用char指针创建一个字符串时,它是如何工作的?

char *name = "ben";

这是’隐藏’指针算术吗?

解决方法 没有任何隐藏的指针算术,但我怀疑你想要一个更详细的答案.

如果你有一个功能:

voID foo() {    char * bar = "Hello World";}

实际上有两个内存块可供使用:

>第一个是12个字节用于存储“Hello World”的位置(每个字母1个字节加末尾的NulL字节).编译器将把它放在数据段中.此内存(位置和值)在编译时设置,不能在运行时修改(如果您尝试它将是segfault).
>第二个位置是指向数据的指针,这是bar变量.当你的程序调用foo()时,它会分配足够的堆栈空间(32位为4个字节)来容纳这个内存位置,并将其初始化为实际数据的位置.每当你玩foo()时都会发生这种情况.

此外,如果您稍后在函数中执行这样的语句:

bar = "Good bye";

您没有将数据“Hello World”更改为“Good bye”.你实际上只是在数据段中有一个第3块内存,其中包含“Good bye”(仍然在编译时分配),然后当该行执行时指针(bar)被设置到该位置.

创建“字符串”(字符数组)的另一种方法是:

voID foo() {    char bar[] = "Hello World";}

这与第一个不同(虽然关闭).在此方法中,您仍然有两个变量,除了您关注的实际数据(“Hello World”空字节)在程序堆栈上分配和初始化.

您可以通过运行gcc -S test.c然后阅读test.s.来查看已编译程序集中的差异.

在某些时候,你会想看看C’s string functions.

在使用这些函数时,要记住的关键是他们根本不知道你的字符数组有多长,他们根据第一个空字符的位置(一个标记值)来计算出来.

总结

以上是内存溢出为你收集整理的c – char * blah =“你好”如何运作?全部内容,希望文章能够帮你解决c – char * blah =“你好”如何运作?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1223471.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存