首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

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

2013-01-11 
我的程序在运行时崩溃是为什么下面这个程序,在运行时崩溃,是为什么?#includeiostream#includestring.h

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

#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的部分挪到后面再教

热点排行