C++ char*a[]={quot;yes";,“no";}是否需要malloc?

C++ char*a[]={quot;yes";,“no";}是否需要malloc?,c++,c,C++,C,像:char*a=“hello”或char*b[]={“yes”,“no”}这样的语句在C语言中似乎是可以访问和打印的,没有任何问题。 他们需要malloc吗?案例1:-char*a=“hello”这里a是字符指针,它需要有效地址,并将有效地址分配为hello是字符串,即地址。所以这里不需要malloc() 案例2:-char*b[]={“是”、“否”}这里b是字符指针数组即b的每个元素都是指针,这意味着每个元素都需要用有效地址初始化,并用b[0]和b[1]和no(即地址)分配有效地址。因此这里

像:
char*a=“hello”
char*b[]={“yes”,“no”}
这样的语句在C语言中似乎是可以访问和打印的,没有任何问题。
他们需要malloc吗?

案例1:-
char*a=“hello”
这里
a
是字符指针,它需要有效地址,并将有效地址分配为
hello
是字符串,即地址。所以这里不需要
malloc()


案例2:-
char*b[]={“是”、“否”}
这里
b
字符指针数组
b
的每个元素都是
指针
,这意味着每个元素都需要用有效地址初始化,并用
b[0]
b[1]
no(即地址)
分配有效地址。因此这里也不需要
malloc()

案例1:-
char*a=“你好”
这里
a
是字符指针,它需要有效地址,并将有效地址分配为
hello
是字符串,即地址。所以这里不需要
malloc()

案例2:-
char*b[]={“是”、“否”}
这里
b
字符指针数组
b
的每个元素都是
指针
,这意味着每个元素都需要用有效地址初始化,并用
b[0]
b[1]
no(即地址)
分配有效地址。因此这里也不需要
malloc()

“hello”这里是字符串常量,它驻留在数据段中,数据段是内存的可读部分

char*a=“hello”什么都不是,但您正在分配常量字符串“hello”的地址 对指针a进行字符化


如果您试图使用ptr a修改此常量字符串的内容,它将崩溃。 例如 a[1]=“E”/>这是未定义的行为

如果您想拥有内存,则使用malloc并将字符串复制到使用malloc创建的内存中。

“hello”这里是字符串常量,它位于内存的可读部分的数据段中

char*a=“hello”什么都不是,但您正在分配常量字符串“hello”的地址 对指针a进行字符化


如果您试图使用ptr a修改此常量字符串的内容,它将崩溃。 例如 a[1]=“E”/>这是未定义的行为


若你们想拥有内存,那个么malloc和复制字符串到使用malloc创建的内存中。

不,它们并没有。C++和C++标准都明确地允许字符串文字用于初始化指向<代码> char < /> >的指针(结果是指向文字中第一个字符的指针)。注意,最好用<代码> const 来前缀。因为使用这样的指针改变字符串文字会产生不明确的行为。@彼得,C++不,除非你有<代码> const < /> >,如C++ 11.不,它们没有。C++和C++标准都明确地允许字符串文字用于初始化指向<代码> char < /> >的指针(结果是指向文字中第一个字符的指针)。注意,最好使用<代码> const < />代码> -因为使用这样的指针改变字符串文字会产生未定义的行为。@彼得,C++不,除非你有<代码> const < />代码,如C++ 11中试图修改字符串文字调用未定义的行为——不能保证它会“崩溃”。还有
char[]=“你好”创建可修改的副本,不需要
malloc
我同意。。编辑感谢“如果您试图使用ptr a修改此常量字符串的内容,它将崩溃。”不是真的,这是未定义的行为,任何事情都可能发生。PC上的现代实现将崩溃,在其他实现上它可能很乐意遵守,现在该文本的所有实例都被修改。试图修改字符串文本将调用未定义的行为-不能保证它会“崩溃”。还有
char[]=“你好”创建可修改的副本,不需要
malloc
我同意。。编辑感谢“如果您试图使用ptr a修改此常量字符串的内容,它将崩溃。”不是真的,这是未定义的行为,任何事情都可能发生。PC上的现代实现将崩溃,在其他实现上它可能会很乐意遵守,现在该文本的所有实例都被修改。情况3:这是不安全的,因为scanf()不会进行边界检查,很可能复制到分配内存的末尾之外,导致分段错误或更糟的情况(例如缓冲区溢出攻击)。在回答中举例说明这种做法可能会导致不安全的代码,因此我认为即使只用于教学效果,也应该指出。是@ThomasH我用两种场景解释了案例3。首先,如果OP扫描输入,它将导致seg。故障&在第二种情况下,我建议使用
malloc()
分配内存。请阅读此处关于
scanf()
关于不安全情况3:这是不安全的,因为scanf()不会进行边界检查,很可能复制到分配内存的末尾之外,从而导致分段错误或更糟的情况(例如缓冲区溢出攻击)。在回答中举例说明这种做法可能会导致不安全的代码,因此我认为即使只用于教学效果,也应该指出。是@ThomasH我用两种场景解释了案例3。首先,如果OP扫描输入,它将导致seg。故障&在第二种情况下,我建议使用
malloc()
分配内存。请阅读此处关于
scanf()
关于不安全