c - 字符串表如何工作?

标签 c pointers compilation

我正在搜索这段我不相信有效的代码,但我在书籍中找到了有关编译器中存在的字符串表的内容。

char *p;
p = "something";

printf("%s", p);

这段代码是如何工作的?

最佳答案

"something" 是一个字符串文字,它是存储在只读内存中的以 null 结尾的字符数组。 p 是一个指向 char 的指针。由于您将此指针设置为指向只读内存,因此您应该始终将其声明为 const char*

sizeof(p) 给出 p 的大小。 p 是一个指针,因此您可以获取指针的大小,在特定系统上为 4 个字节。

如果您声明一个数组 char arr[] = "something";,您将获得存储在本地数组中的某些内容的副本,您也可以在其中修改它。如果你获取一个数组的 size,你就会得到预期的大小。在数组情况下,sizeof(arr) 将为您提供 9+1=10 字节。

作为引用,请阅读:

What is the difference between char s[] and char *s?

Why do I get a segmentation fault when writing to a string initialized with "char *s" but not "char s[]"?

关于c - 字符串表如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27018139/

相关文章:

c - Valgrind:在 strcpy 上写入大小 1 无效

C 警告 : No return statement in function returning non-void

c++ - void*字面意思是float,怎么投?

c - free() 在 c 代码中收集垃圾值,即使在释放后将指针设置为 NULL,代码也不起作用

visual-studio - 在没有 Visual Studio 的情况下编译 .vbproj 或 .csproj 项目文件

带有可变参数的 C printf 说明符。未定义的行为在哪一点上有问题?

c - 带有指向 const 数据的目标指针的 memcpy

c - 异常的 C 指针行为

G++ -I 编译程序选项

class - 汇编程序如何处理类和对象,它们如何存储在 RAM 和可执行文件中?