2011-02-15 118 views
1

我得到了我的程序的这种奇怪的行为,我无法弄清楚。我的教授向我展示了一个缺陷,在我的程序中,我只是在构建一个对象时复制一个字符指针,而不是创建整个数组的新副本,因此您可以使用它。他用类似的代码来证明这一点。尝试设置字符数组的字符时程序崩溃

的代码:

char sweat[] ="Sweater"; 
warenkorb = new WareImKorb(new Textil (205366,4.2,sweat,40),2,warenkorb); 
sweat[0] = '\0'; 

现在如果我反而使其:

char* sweat ="Sweater"; 

程序运行正常,直到我尝试汗水[0] = '\ 0'; 它只是然后开始。

但是,这个作品: char cc [] =“毛衣”; char * sweat = cc;

这真的让我感到困扰,我不明白,为什么版本1不起作用。 希望你们能帮助我,否则我会疯狂地想知道这件事。

+0

对第一个版本不起作用的是什么?你为什么使用char数组而不是std :: string? – CashCow 2011-02-15 18:00:39

回答

3
char* sweat ="Sweater"; 
sweat[0] = '\0' 

这里sweat指向一个恒定的数据来完成。 “毛衣”是常量字面数据,位于只读存储器的某处,并且sweat也指向此数据。 它不会复制它。所以当你做sweat[0]='\0'时,它会尝试改变CONSTANT数据的第一个字符。因此错误。顺便说一句,如果你不在你的声明中写const作为const char* sweater = "Sweater",好的编译器应该给出警告。请参阅此处的警告:http://www.ideone.com/P47vv

但是,当您编写char sweat[] = "Sweater"时,会创建一个char数组,从CONSTANT数据复制数据,该数据为"Sweater";该数组的元素本身是可修改的!


让我们来看看一个有趣的事情:因为在第一种情况下,它不会使常量数据的副本,所以无论你有多少个变量声明(都指向相同的数据),地址对于所有变量都是相同的。看到这一点:

#include<cstdio> 
int main() { 
     char* sweat ="Sweater";  //notice the warning 
     const char* another ="Sweater"; //no warning! 
     std::printf("%p\n", sweat);  //print the address 
     std::printf("%p\n", another); //print the address 
     return 0; 
} 

输出:

0x8048610 
0x8048610 

手段,既printfs输出打印相同的地址!

看到自己的位置:http://www.ideone.com/VcyM6

5

“Sweater”是一个字符串文字,它可能驻留在只读存储器中。使用char []语法将此文字复制到char数组中,使用char *语法(实际上应该是const char *)仅指向原始字符串文字。

0

在不起作用的版本中,您没有创建任何字符数组。你只玩指针。

对于sweat[0] = '\0'是一个有效的语句,您需要sweat是一个实际的字符数组。

这仅与char sweat[] = "XXXX";或焦炭sweat[20];

0

C++是不是一个托管语言。避免创建指向不具有适当大小的字符数组的指针。下面的两个例子是更好的解决方案:

char* sweater = new char[10]; 
sweater[0] = '\0'; 
delete [] sweater; 
sweater = NULL; 

或者更好的是:

std::string sweater = ""; 
2

ASCII艺术来救援!该char sweat[]版本看起来像这样的记忆:

 +---+---+---+---+---+---+---+---+ 
sweat: |'S'|'w'|'e'|'a'|'t'|'e'|'r'| 0 | char[8] 
     +---+---+---+---+---+---+---+---+ 

尽管char* sweat版本是这样的:

 +---+---+---+---+---+---+---+---+ 
     |'S'|'w'|'e'|'a'|'t'|'e'|'r'| 0 | const char[8] 
     +---+---+---+---+---+---+---+---+ 
     ^
     | 
     | 
     +-|-+ 
sweat: | | | char* 
     +---+ 

这是正确的,一个char*指向const char。事实上,你可以将一个字符串文字分配给非const字符指针,这在C++的静态类型系统中是一个令人讨厌的圣洁。诅咒你,向后兼容!

相关问题