初始化char *没有给出错误

时间:2014-06-03 11:29:55

标签: c++ c

struct st{ 
int a; 
char *ptr; 
}obj; 

main()
{   
   obj.a=10;    
   obj.ptr="Hello World";          // (1) memory allocation?
   printf("%d,%s",obj.a,obj.ptr);
}

ptr在struct中声明。当Hello world的分配发生时,内存未分配,但此程序正常工作并正确输出。在标记(1)完成作业时,它不应该失败/崩溃吗?

5 个答案:

答案 0 :(得分:6)

"Hello World"是一个字符串文字,位于程序的只读内存部分(.rodata)中。您指向此部分然后打印内容。程序行为是100%明确定义的,不应该崩溃。

不过,最好将指向字符串文字的指针声明为const char*,因为不允许修改字符串文字。

答案 1 :(得分:1)

完全有效。

在编译时(减去编译器优化),它们被放置在代码的text / rodata段中。不确定您是否熟悉内存中可执行文件的布局(也称为运行时环境),但您有文本,数据,BSS,堆和堆栈。

  obj.ptr="Hello World";  

会将Hello World放在内存的只读部分,并使obj.ptr指向该内存,使得对此内存的任何写入操作都是非法的。

它没有名称,并且具有静态存储持续时间(意味着它在程序的整个生命周期中存在);和一个名为obj.ptr的指向char的类型的变量,它使用该未命名的只读数组中第一个字符的位置进行初始化。

在运行时,char指针在堆栈上分配,并首先设置为指向内存中字符串Hello World所在的区域。

答案 2 :(得分:1)

首先,答案根据语言而有所不同(C 或者C ++),在C ++的情况下,标准的版本。 但是,在这两种情况下,"Hello World" is a string literal: in C, it has type char [12] , and in C++, type char const [12]`, 并且数组具有静态生存期,因此存在于生命周期中 该程序。

在C中,当您将其指定给char*时,您就拥有了标准 数组到指针的转换;在C ++ pre-C ++ 11中,你有 已弃用的char const[]char*转化,仅限 如果char const[]是字符串文字,则有效 编译器应该警告;在C ++ 11中,转换是非法的,并且 你的程序不应该编译(但我愿意打赌它 多年后才会这样。)

答案 3 :(得分:0)

我的编译器(g ++ 4.7.2)抛出警告:

warning: deprecated conversion from string constant to ‘char*’ [-Wwrite-strings]

如果您没有收到此警告,可以尝试将-Wall传递给编译器(imo总是一个好主意)

答案 4 :(得分:-2)

当您将字符串文字指定给char指针时,您没有分配内存! 所有这一切都是在内存中搜索字符串的一部分,如果找到它 - 它指向它的开头 - 如果没有找到则创建它。无论哪种方式 - 没有分配内存并且指针变成常量(只读) - 只是尝试看看你不能改变它,因为它是内存中的常量 - 有时如果你不想改变那个就好了字符串,有时它不是 - 取决于你想做什么:)