在 C 中调整动态矩阵的大小
Resizing Dynamic Matrix in C
我遇到了一些非常愚蠢的问题。但我无法解决问题。我设计了一个函数,可以根据动态调整大小的字符串构建列矩阵。
typedef struct{
double ** m_;
size_t rows_, cols_;
}matrix_t;
int loadCol(char* str, matrix_t* col){
size_t size=0; char* ptr;
if(str==NULL) return 0;
if((col=(matrix_t*)malloc(sizeof(matrix_t)))==NULL) return 0;
if((col->m_=(double**)malloc(sizeof(double*)))==NULL) return 0;
ptr = strtok(str, "|");
do{
if(((col->m_)[0]=(double*)realloc((col->m_), sizeof(double)*(size+1)))==NULL){
eraseMatrix(col);
return 0;
}
(col->m_)[0][size]=atof(ptr); /*SIGSEV*/
size++;
}while((ptr=strtok(NULL,"|"))!=NULL);
col->cols_ = 1; col->rows_ = size;
return size;
}
我用 gdb 调试,问题似乎出在带有注释 SIGSEV 的赋值行标记中。此外,当程序流从该函数作用域流出时,col->cols_ 的数据不正确。
我的函数哪里出了问题?
要在函数中修改 col 并将修改反映给调用者,需要将指向 col 的指针作为 matrix_t **col
传递。然后 col 必须在函数中取消引用。
如果 col 声明为 matrix_t *col = NULL;
,则调用者将使用 loadCol ( str, &col);
int loadCol(char* str, matrix_t** col){
size_t size=0; char* ptr;
if(str==NULL) return 0;
if((*col=(matrix_t*)malloc(sizeof(matrix_t)))==NULL) return 0;
if(((*col)->m_=(double**)malloc(sizeof(double*)))==NULL) return 0;
ptr = strtok(str, "|");
do{
if((((*col)->m_)[0]=(double*)realloc(((*col)->m_)[0], sizeof(double)*(size+1)))==NULL){
//eraseMatrix(col);
return 0;
}
((*col)->m_)[0][size]=atof(ptr);
size++;
}while((ptr=strtok(NULL,"|"))!=NULL);
(*col)->cols_ = 1; (*col)->rows_ = size;
return size;
}
strpbrk 和 strtod 也可用于解析字符串中的值。
int loadCol(char* str, matrix_t** col){
size_t size=0; char* ptr;
char *next = NULL;
if(str==NULL) return 0;
if((*col=(matrix_t*)malloc(sizeof(matrix_t)))==NULL) return 0;
if(((*col)->m_=(double**)malloc(sizeof(double*)))==NULL) return 0;
next = str;
while((ptr=strpbrk(next,"0123456789-+."))!=NULL) {
if((((*col)->m_)[0]=(double*)realloc(((*col)->m_)[0], sizeof(double)*(size+1)))==NULL){
//eraseMatrix(col);
return 0;
}
((*col)->m_)[0][size]=strtod(ptr,&next);
size++;
}
(*col)->cols_ = 1; (*col)->rows_ = size;
return size;
}
我遇到了一些非常愚蠢的问题。但我无法解决问题。我设计了一个函数,可以根据动态调整大小的字符串构建列矩阵。
typedef struct{
double ** m_;
size_t rows_, cols_;
}matrix_t;
int loadCol(char* str, matrix_t* col){
size_t size=0; char* ptr;
if(str==NULL) return 0;
if((col=(matrix_t*)malloc(sizeof(matrix_t)))==NULL) return 0;
if((col->m_=(double**)malloc(sizeof(double*)))==NULL) return 0;
ptr = strtok(str, "|");
do{
if(((col->m_)[0]=(double*)realloc((col->m_), sizeof(double)*(size+1)))==NULL){
eraseMatrix(col);
return 0;
}
(col->m_)[0][size]=atof(ptr); /*SIGSEV*/
size++;
}while((ptr=strtok(NULL,"|"))!=NULL);
col->cols_ = 1; col->rows_ = size;
return size;
}
我用 gdb 调试,问题似乎出在带有注释 SIGSEV 的赋值行标记中。此外,当程序流从该函数作用域流出时,col->cols_ 的数据不正确。 我的函数哪里出了问题?
要在函数中修改 col 并将修改反映给调用者,需要将指向 col 的指针作为 matrix_t **col
传递。然后 col 必须在函数中取消引用。
如果 col 声明为 matrix_t *col = NULL;
loadCol ( str, &col);
int loadCol(char* str, matrix_t** col){
size_t size=0; char* ptr;
if(str==NULL) return 0;
if((*col=(matrix_t*)malloc(sizeof(matrix_t)))==NULL) return 0;
if(((*col)->m_=(double**)malloc(sizeof(double*)))==NULL) return 0;
ptr = strtok(str, "|");
do{
if((((*col)->m_)[0]=(double*)realloc(((*col)->m_)[0], sizeof(double)*(size+1)))==NULL){
//eraseMatrix(col);
return 0;
}
((*col)->m_)[0][size]=atof(ptr);
size++;
}while((ptr=strtok(NULL,"|"))!=NULL);
(*col)->cols_ = 1; (*col)->rows_ = size;
return size;
}
strpbrk 和 strtod 也可用于解析字符串中的值。
int loadCol(char* str, matrix_t** col){
size_t size=0; char* ptr;
char *next = NULL;
if(str==NULL) return 0;
if((*col=(matrix_t*)malloc(sizeof(matrix_t)))==NULL) return 0;
if(((*col)->m_=(double**)malloc(sizeof(double*)))==NULL) return 0;
next = str;
while((ptr=strpbrk(next,"0123456789-+."))!=NULL) {
if((((*col)->m_)[0]=(double*)realloc(((*col)->m_)[0], sizeof(double)*(size+1)))==NULL){
//eraseMatrix(col);
return 0;
}
((*col)->m_)[0][size]=strtod(ptr,&next);
size++;
}
(*col)->cols_ = 1; (*col)->rows_ = size;
return size;
}