zwol..:你已经绊倒在C++中一个非常古老的向后" />

memset不使用指向字符的指针

您所在的位置:网站首页 memset用法 memset不使用指向字符的指针

memset不使用指向字符的指针

2023-02-25 06:31| 来源: 网络整理| 查看: 265

using namespace std; int main(int argc, char** argv) { char* name = "SAMPLE TEXT"; memset(name , '*', 6); cout

捕获分段错误的上述程序的屏幕截图

1> zwol..:

你已经绊倒在C++中一个非常古老的向后兼容性疣,由C继承和约会的日子时,有是没有这样的东西const.字符串文字具有类型const char [n],但是,除非您告诉编译器您不需要与1990之前的代码兼容,否则它将默认允许您设置char *变量以指向它们.但它不会让你通过这样的指针写.实际内存(尽可能)标记为只读; 您观察到的"分段故障"错误是操作系统报告尝试写入只读内存的方式.

就语言规范而言,const通过非const指针写入数据- 但是你设法将其设置为 - 具有"未定义的行为",这是一种奇特的方式,说"程序不正确,但编译器没有发布诊断,如果你得到一个已编译的可执行文件,它可能会做任何事情." "分段错误"几乎总是意味着您的程序在某处具有未定义的行为.

如果我用适当的设置编译你的程序,我会收到一个错误:

$ g++ -std=gnu++11 -Wall -Werror test.cc test.cc: In function ‘int main(int, char**)’: test.cc:7:19: error: ISO C++ forbids converting a string constant to ‘char*’ [-Werror=write-strings] char* name = "SAMPLE TEXT"; ^~~~~~~~~~~~~

在获得足够的技能以了解何时更适合不同的设置之前,请使用或编译所有 C++程序-std=gnu++11 -Wall -Werror,或者编译器的等效编译.(您似乎使用的是Unix风格的操作系统,因此这些设置应该有效.您可能也需要-g和/或-O.)

您的程序可以通过将其更改为读取来工作

#include #include int main() { char name[] = "SAMPLE TEXT"; std::memset(name, '*', 6); std::cout

=>

$ g++ -std=c++11 -Wall -Werror test.cc $ ./a.out ****** TEXT

修复bug的更改来自char *name于char name[]; 我也改变了其他一些东西,但只是为了表现出更好的风格.这样做是强制编译器在进入时将字符串文字复制到可写内存main. 为什么这样做需要很长时间来解释; 咨询一本好的C++教科书.



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3