RT,这是个简单的代码处理数组插入,想在插入时判断此时数组是否将满,如果是就将数组扩大的原来的2倍。
不明白为什么int newspace=(int)malloc(size*sizet);有什么错误,如果把size改成一个定值就可以运行且结果正确,难道时malloc的bug?
#include <stdlib.h>//malloc
#include <string.h>//memset
#include <stdio.h>//printf
#define MAXIMUM 100
struct SeqList{
int n;
int * array;
int max;
};
typedef struct SeqList *PSeqList;
PSeqList createSeqList(int size){
PSeqList ptrSeqList=(PSeqList)malloc(sizeof(struct SeqList));
if(ptrSeqList==NULL){
return NULL;
}
ptrSeqList->n=0;
ptrSeqList->array=(int*)malloc(size*sizeof(int));
ptrSeqList->max=size;
return ptrSeqList;
}
int insertElement(int pos, int val, PSeqList pSeqList){
if(pSeqList==NULL)
return -1;
if(pSeqList->n==pSeqList->max){
int size=pSeqList->n<<1;
int sizet=sizeof(int);
int *newspace=(int*)malloc(size*sizet);
memset((void*)newspace,0,size*sizeof(int));
int i=0;
while(i++<pSeqList->max){
newspace[i]=pSeqList->array[i];
}
free(pSeqList->array);
pSeqList->array=newspace;
pSeqList->max<<=1;
}
if(pSeqList->n==0){
pSeqList->array[0]=val;
pSeqList->n++;
return 0;
}
int i;
for(i=pSeqList->n;i>=pos;--i){
pSeqList->array[i+1]=pSeqList->array[i];
}
pSeqList->n++;
pSeqList->array[pos]=val;
}
void printArray(PSeqList ptrSeqList){
printf("n: %d\n",ptrSeqList->n);
printf("max: %d\n",ptrSeqList->max);
int i=0;
for(i;i<ptrSeqList->n;++i){
printf("%d ",ptrSeqList->array[i]);
}
}
int main(int argc, char*argv[]){
PSeqList ptrSeqList=createSeqList(5);
printArray(ptrSeqList);
int i=0;
for(i=0;i<10;++i){
insertElement(i,i,ptrSeqList);
}
printArray(ptrSeqList);
insertElement(5,110,ptrSeqList);
printArray(ptrSeqList);
return 0;
}
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
下次出现segfault记得先使用valgrind自己检查一遍。
我用valgrind运行了一遍,显示你的代码在main的
for(i=0;i<10;++i){
insertElement(i,i,ptrSeqList);
}
中,在insertElement的
int i;
for(i=pSeqList->n;i>=pos;--i){
pSeqList->array[i+1]=pSeqList->array[i];
}中,数组越界了。