c++的一个字符串拷贝的问题

Xcode下一个字符串拷贝的问题,弄了半天没太搞清楚是什么原因。

主函数是这样的:

char* Convertvalue(Tuple &tuple)
{
    string value = "";
    
    int tupleLength = (int)tuple.length();
    std::cout<<tuple.length()+2<<std::endl;

    char *p = (char*)malloc((tupleLength+2)*sizeof(char));
//    char *p = new char[tupleLength+2];
    memset(p, 0, tuple.length()+2);
    char *v = p;
    
    int ivalue;
    float fvalue;
    
    for(int i=0;i<tuple.attr_count;i++)
    {
        if(tuple.attrs[i].attr_type == CHAR)
        {
            std::cout<<tuple.attr_values[i].data()<<endl;
            strcpy(v,tuple.attr_values[i].data());
            v += tuple.attr_values[i].size();
        }
        if(tuple.attrs[i].attr_type == INT)
        {
            ivalue = atoi(tuple.attr_values[i].c_str());
            
            memcpy(v, &ivalue, 4);
            v += 4;
        }
        if(tuple.attrs[i].attr_type == FLOAT)
        {
            fvalue = (float) atof(tuple.attr_values[i].c_str());
            memcpy(v,&fvalue,4);
            v += 4;
        }
    }
    std::cout<<*p<<std::endl;
    return p;
}

其中tuple的结构如下:

struct Table
{
    string table_name;  //表名
    int attr_count;            //表中属性的总个数
    Attribute attrs[32];    //表的所有属性列表, 最多32个属性
    //return primary key id
    int getPrimaryKeyId() {
        for (int i = 0; i < attr_count; ++i)
        {
            if (attrs[i].attr_key_type == PRIMARY)
            {
                return i;
            }
        }
        //if no primary key
        return -1;
    }
    
    int searchAttrId(string att_name) {
        for (int i = 0; i < attr_count; ++i)
        {
            if (attrs[i].attr_name == att_name)
            {
                return i;
            }
        }
        //if no primary key
        return -1;
    }
    
    int length()
    {
        int len = 0;
        for (int i = 0; i < attr_count; ++i)
        {
            len += attrs[i].attr_len;
        }
        return len;
    }
};

struct Tuple: public Table
{
    string attr_values[32];
};

一个tuple实例化例子:

    Tuple tuple1;
    //tuple继承了table的public属性并且用到了,所以这边我先模拟一下
    //实际上可以用memcpy来搞这个事情
    
    tuple1.table_name = "test_table6";
    tuple1.attr_count = 3;
    tuple1.attrs[0].attr_name="id";
    tuple1.attrs[0].attr_type=INT;
    tuple1.attrs[0].attr_key_type=PRIMARY;
    tuple1.attrs[0].attr_len=1;
    
    tuple1.attrs[1].attr_name="name";
    tuple1.attrs[1].attr_type=CHAR;
    tuple1.attrs[1].attr_key_type=EMPTY;
    tuple1.attrs[1].attr_len=31;
    
    tuple1.attrs[2].attr_name="age";
    tuple1.attrs[2].attr_type=INT;
    tuple1.attrs[2].attr_key_type=EMPTY;
    tuple1.attrs[2].attr_len=1;
    
    //插入的时候我们需要注意的是,我们这里基本上都转化成字符串插入了,int和浮点数什么的,要写成字符串,否则会出错
    tuple1.attr_values[0]="18";
    tuple1.attr_values[1]="xiaotao4";
    tuple1.attr_values[2]="25";

最后那个返回的char* p 并不是一个预期的字符串,而是一个"x12",只是包含第一个内容。

我表示不知道为什么出现这样的问题....

阅读 3.1k
1 个回答
新手上路,请多包涵

ivalue = atoi(tuple.attr_values[i].c_str());
memcpy(v, &ivalue, 4);
十进制的18就是16进制的12啊,你自己转成INT存的地址。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题