读书人

小弟我的程序在运行时崩溃是为什么

发布时间: 2013-01-11 11:57:35 作者: rapoo

我的程序在运行时崩溃是为什么
下面这个程序,在运行时崩溃,是为什么?

#include<iostream>
#include<string.h>

using namespace std;

int main()
{
char** p = new char* [20];
for (int i = 0; i < 4; i++)
{
strcpy(p[i], "cmdblock");
cout << p[i] << endl;
cout << *(p+i) << endl;
}
return 0;
}

[解决办法]
因为你只new了一次,二维阵列要new两次

void two_char_array()
{
char** p = new char*[20];
for(size_t i = 0; i != 20; ++i){
p[i] = new char[20];
}
for (int i = 0; i < 4; i++)
{
strncpy(p[i], "cmdblock\0", 20); //改用strncpy会比较安全
cout << p[i] << endl;
cout << *(p+i) << endl;
}

for(size_t i = 0; i != 20; ++i){
delete p[i];
}

delete []p;
}


为何要new二次?你new第一次是分配了20个char*的指标
---------------------------
p[0]指向 char*
p[1]指向 char*
....
p[19]指向 char*
---------------------------
p[0]~p[19]的char*没有得到memory

new第二次的时候是为p[0]~p[19]的char*分配memory
---------------------------
p[0]的char*指向一块memory
p[1]的char*指向一块memory
....
p[19]的char*指向一块memory
---------------------------

根据上面的逻辑,回收的时候也要回收两次

既然是c++,若无特殊需求,我推荐你使用这个简易版本

void easy_string()
{
std::vector<std::string> str_array(20);
for(size_t i = 0; i != 4; ++i){
str_array[i] = "cmdblock";
cout<<str_array[i]<<endl;
}
}


性能可能比较好的版本

void easy_string_2()
{
std::vector<std::string> str_array(20);
for(size_t i = 0; i != 4; ++i){
str_array[i].reserve(9);
str_array[i] = "cmdblock";
cout<<str_array[i]<<endl;
}
}


你可以先掌握好stl的基本使用方法才回头学如何善用new, malloc
以及各种pointer arithmetic,这些部分比较困难
c++ primer 5的内容也是把这些比较low level的部分挪到后面再教

读书人网 >C++

热点推荐