#include <stdio.h>int main(){ char *str1 = "Mesg 1"; char *str2 = "Mesg 2"; char str3[] = "Mesg 3"; char str4[] = "Mesg 4"; printf("str1 = %p\n",(voID *) str1); printf("str2 = %p\n",(voID *) str2); printf("&str3 = %p\n",(voID *) str3); printf("&str4 = %p\n",(voID *) str4); return 0;}
输出:
str1 = 0x400668str2 = 0x40066f&str3 = 0x7fffcc990b10&str4 = 0x7fffcc990b00
这种用法是否有一个独立的地址空间?
解决方法 该标准没有指定字符串文字将驻留在何处,但很可能它将在只读数据部分中.例如,在使用objdump的Unix系统上,您可以像这样检查只读数据部分:objdump -s -j .rodata a.out
并使用Live Example我们可以看到类似于此的输出:
Contents of section .rodata: 400758 01000200 4d657367 20310073 74723120 ....Mesg 1.str1 400768 3d202570 0a004d65 73672032 00737472 = %p..Mesg 2.str 400778 32203d20 25700a00 26737472 33203d20 2 = %p..&str3 = 400788 25700a00 26737472 34203d20 25700a00 %p..&str4 = %p..
C99标准草案第6.4.5节字符串文字第5段说:
[…] The multibyte character sequence is then used to initialize an array of static storage duration and length just sufficIEnt to contain the sequence.[…]
这意味着字符串文字的生命周期是程序的生命周期,第6段说:
It is unspecifIEd whether these arrays are distinct provIDed their elements have the
appropriate values. If the program attempts to modify such an array,the behavior is
undefined.
所以我们不知道它们是否是不同的,这将是一个实现选择,但我们知道我们无法修改它们.否则它没有指定它们应该如何存储.
总结以上是内存溢出为你收集整理的c – 字符串文字的地址长度全部内容,希望文章能够帮你解决c – 字符串文字的地址长度所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)