user-0 提问: 关于C++数据结构，结构体数组插入失败顺序表的问题，

回复:
user: user-0
content: 引用 5 楼 hdt 的回复:newbase=(ElemType * )realloc(L.elem ,(L.listsize +LISTINCREMENT)*sizeof(ElemType));   [quote=引用 4 楼 yosenc 的回复:] [quote=引用 2 楼 hdt 的回复:] 我在另外的帖子里已经回复你了 既然用到了c++，比如string 应该用new 和delete代替malloc 和freemalloc 和free也通得过呀-[/quote] 编译没问题不代表运行没问题 你用了malloc,而你的结构里面有个string,用malloc，不能自动调用那个string的构造函数，因此那个string成员并没有构造好 ，所以后面的赋值将会出错。 而且你dele的时候，因为同理，不会调用string的析构函数，所以正常销毁string[/quote]了解，谢谢

user: user-1
content: newbase=(ElemType * )realloc(L.elem ,(L.listsize +LISTINCREMENT)*sizeof(ElemType));   引用 4 楼 yosenc 的回复:[quote=引用 2 楼 hdt 的回复:] 我在另外的帖子里已经回复你了 既然用到了c++，比如string 应该用new 和delete代替malloc 和freemalloc 和free也通得过呀-[/quote] 编译没问题不代表运行没问题 你用了malloc,而你的结构里面有个string,用malloc，不能自动调用那个string的构造函数，因此那个string成员并没有构造好 ，所以后面的赋值将会出错。 而且你dele的时候，因为同理，不会调用string的析构函数，所以正常销毁string

user: user-0
content: 引用 2 楼 hdt 的回复:我在另外的帖子里已经回复你了 既然用到了c++，比如string 应该用new 和delete代替malloc 和freemalloc 和free也通得过呀-

user: user-0
content: 引用 1 楼 cfjtaishan 的回复:#include <stdio.h> #include <stdlib.h> #include <malloc.h> #include <string.h> #include <iostream>  using namespace std;  #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define INFEASIBLE -1 #define OVERFLOW -2  #define list_init_size 100   //线性表存储空间的初始分配量 #define LISTINCREMENT 10     //线性表存储空间的分配增量  typedef int Status;   typedef struct elem_type {     //string a;     //string nam;     char a[16];     char nam[16];     float pric;     int cot;     double alcot; }ElemType;  typedef struct sqlist{     ElemType *elem;          //存储空间基址     int length;              //当前长度     int listsize;            //当前分配的存储容量（以sizeof(ElemType)为单位） }SqList;  //构造一个空的线性表L Status InitList_Sq(SqList &L) {     L.elem = (ElemType * )malloc(list_init_size * sizeof(ElemType));     if(!L.elem )         exit(OVERFLOW);//存储分配失败     L.length = 0;               //空表长度为0     L.listsize = list_init_size;//初始存储容量     return OK; }//Initlist_Sq  //在顺序线性表L中第i个位置之前插入新的元素e， //i的合法值为1<=i<=ListLength_Sq(L)+1 Status ListInsert_Sq(SqList &L,int i,ElemType e) {     ElemType *p,*q,*newbase;        //定义指针      if(i < 1||i > L.length + 1)         return ERROR;               //i值不合法     if(L.length >= L.listsize ){     //当前存储空间已满，增加分配         newbase = (ElemType * )realloc(L.elem ,(L.listsize + LISTINCREMENT)*sizeof(ElemType));         if(!newbase)             exit(OVERFLOW); //存储分配失败         L.elem = newbase;            //新基址         L.listsize += LISTINCREMENT; //增加存储容量     }     if (i >= L.length) {         L.elem[L.length] = e;     } else {         q = &(L.elem[i-1]);              //q为插入位置         for(p = &(L.elem [L.length -1]);p > q; --p)             *(p+1) = *p;         *q = e;                           //插入e     }     ++L.length;                    //表长增1     return OK; }//ListInsert_Sq   void input_Elem(SqList k) {     for(int i=0;i<k.length;i++)         cout<<k.elem[i].a<<" "<<k.elem[i].nam<<" "<<k.elem[i].pric<<" "<<k.elem[i].cot<<" "<<endl; } int main() {     SqList l1;     InitList_Sq(l1);     ElemType ele[2];       //ele[0].a="a123";     //ele[0].nam="a1";     strcpy(ele[0].a, "a123");     strcpy(ele[0].nam, "a1");     ele[0].pric=3.6;     ele[0].cot=4;     ListInsert_Sq(l1,1,ele[0]);      //ele[1].a="a223";     //ele[1].nam="a2";     strcpy(ele[1].a, "a223");     strcpy(ele[1].nam, "a2");     ele[1].pric=3.3;     ele[1].cot=5;     ListInsert_Sq(l1, 2, ele[1]);      cout<<"first:"<<endl;     input_Elem(l1);     cout<<endl;     return 0; }  参考一下吧  验证了一下，若用string定义a和nam，在赋值操作时，即 *q = e; 会出现段错误； 换成char []数组后没问题。可以直接赋值。  另外，插入位置作为微调，问题是当length为0时，p = &(L.elem [L.length -1]) p指向的就是&(L.elem[-1]);所以做了修改。非常感谢！

user: user-1
content: 我在另外的帖子里已经回复你了 既然用到了c++，比如string 应该用new 和delete代替malloc 和free

user: user-2
content: #include <stdio.h> #include <stdlib.h> #include <malloc.h> #include <string.h> #include <iostream>  using namespace std;  #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define INFEASIBLE -1 #define OVERFLOW -2  #define list_init_size 100   //线性表存储空间的初始分配量 #define LISTINCREMENT 10     //线性表存储空间的分配增量  typedef int Status;   typedef struct elem_type {     //string a;     //string nam;     char a[16];     char nam[16];     float pric;     int cot;     double alcot; }ElemType;  typedef struct sqlist{     ElemType *elem;          //存储空间基址     int length;              //当前长度     int listsize;            //当前分配的存储容量（以sizeof(ElemType)为单位） }SqList;  //构造一个空的线性表L Status InitList_Sq(SqList &L) {     L.elem = (ElemType * )malloc(list_init_size * sizeof(ElemType));     if(!L.elem )         exit(OVERFLOW);//存储分配失败     L.length = 0;               //空表长度为0     L.listsize = list_init_size;//初始存储容量     return OK; }//Initlist_Sq  //在顺序线性表L中第i个位置之前插入新的元素e， //i的合法值为1<=i<=ListLength_Sq(L)+1 Status ListInsert_Sq(SqList &L,int i,ElemType e) {     ElemType *p,*q,*newbase;        //定义指针      if(i < 1||i > L.length + 1)         return ERROR;               //i值不合法     if(L.length >= L.listsize ){     //当前存储空间已满，增加分配         newbase = (ElemType * )realloc(L.elem ,(L.listsize + LISTINCREMENT)*sizeof(ElemType));         if(!newbase)             exit(OVERFLOW); //存储分配失败         L.elem = newbase;            //新基址         L.listsize += LISTINCREMENT; //增加存储容量     }     if (i >= L.length) {         L.elem[L.length] = e;     } else {         q = &(L.elem[i-1]);              //q为插入位置         for(p = &(L.elem [L.length -1]);p > q; --p)             *(p+1) = *p;         *q = e;                           //插入e     }     ++L.length;                    //表长增1     return OK; }//ListInsert_Sq   void input_Elem(SqList k) {     for(int i=0;i<k.length;i++)         cout<<k.elem[i].a<<" "<<k.elem[i].nam<<" "<<k.elem[i].pric<<" "<<k.elem[i].cot<<" "<<endl; } int main() {     SqList l1;     InitList_Sq(l1);     ElemType ele[2];       //ele[0].a="a123";     //ele[0].nam="a1";     strcpy(ele[0].a, "a123");     strcpy(ele[0].nam, "a1");     ele[0].pric=3.6;     ele[0].cot=4;     ListInsert_Sq(l1,1,ele[0]);      //ele[1].a="a223";     //ele[1].nam="a2";     strcpy(ele[1].a, "a223");     strcpy(ele[1].nam, "a2");     ele[1].pric=3.3;     ele[1].cot=5;     ListInsert_Sq(l1, 2, ele[1]);      cout<<"first:"<<endl;     input_Elem(l1);     cout<<endl;     return 0; }  参考一下吧  验证了一下，若用string定义a和nam，在赋值操作时，即 *q = e; 会出现段错误； 换成char []数组后没问题。可以直接赋值。  另外，插入位置作为微调，问题是当length为0时，p = &(L.elem [L.length -1]) p指向的就是&(L.elem[-1]);所以做了修改。