有人能解释print((函数的错误吗?
printf("Control"(从不工作,输出为分段故障-11
int main(int argc, char **argv){
int m=5,n=4; // matrix[5][4]
int a=50,b=20; // range: 20-50
int **matrix;
imatrix(matrix,m,n,a,b);
print(matrix,m,n);
第一步:用值填充地址
void imatrix(int **matrix,int m,int n,int max, int min){
srand(time(NULL));
int i=0,j=0;
matrix = (int **)malloc( m * sizeof(int*) );
if( matrix == NULL ){
printf( "memory req.!" );
}
for( i = 0; i < m; i++ ) {
matrix[i] = (int *)malloc( n * sizeof(int) );
if( matrix[i] == NULL ){
printf( "memory req.!" );
}
}
for(i=0;i<m;i++){
for(j=0;j<n;j++){
matrix[i][j]=(rand()%(max-min))+min;
printf("%2d ",matrix[i][j]);
}
printf("nn");
}
}
到这里为止一切都还好。我得到了分段错误:11后面的代码和行的";控制";从不工作
void print(int **matrix, int m, int n){
int i,j;
for(i=0; i < m; i++){
for(j=0; j < n; j++){
printf("%d",*(*(matrix + i) + j));
}
printf("n");
}
printf("control");
}
分段错误的不是printf("control")
(尽管你最好不要使用printf
:考虑将其更改为puts("control")
,它也会输出换行符。(这是之前打印矩阵的尝试,它正在取消对未初始化值的引用。
发生这种情况是因为imatrix
函数不返回它创建的矩阵,并且main
中的matrix
没有给定任何值。
事实上,imatrix
不返回任何内容,因为它被定义为返回void
。它采用了一个matrix
参数,我想它应该是一个输出参数,但是:
-
该参数的输出参数类型错误(输出参数需要是指向要返回的对象的指针;(
-
它从不试图使用指向要返回的对象的指针来返回对象。
为了满足这些要求,您需要原型
void imatrix(int*** matrix, int m, int n, int max, int min);
您必须为每次使用matrix
添加一个额外的间接级别[注1]:
*matrix = malloc(m * sizeof(**matrix));
if (*matrix == NULL) {
printf( "memory req.!" );
/* NOTE: You shouldn't attempt to continue after the malloc fails.
* Return immediately and let the caller deal with the malloc failure.
*/
}
for( i = 0; i < m; i++ ) {
(*matrix)[i] = malloc( n * sizeof(*(*matrix)[i])) );
if( (*matrix)[i] == NULL ){
// etc.
我认为我们可以同意,这是一个重大的PITA,除非必要,否则不值得麻烦。
就我个人而言,我发现除非绝对必要,否则根本不使用输出参数不那么令人困惑。在这种情况下,根本没有必要,因为您只需返回指针来分配内存:
/* CHANGE: Prototype */
int** imatrix(int m, int n, int max, int min){
srand(time(NULL)); /* TODO: This initialisation should really be done in main */
int i=0, j=0;
/* CHANGE: matrix is a local variable */
int** matrix = malloc( m * sizeof(*matrix) );
/* CHANGE: Immediate return on malloc failure */
if( matrix == NULL ) {
return matrix;
}
for( i = 0; i < m; i++ ) {
matrix[i] = malloc( n * sizeof(*matrix[i]) );
if( matrix[i] == NULL ){
printf( "memory req.!" );
}
}
for(i=0;i<m;i++){
for(j=0;j<n;j++){
matrix[i][j]=(rand()%(max-min))+min;
printf("%2d ",matrix[i][j]);
}
printf("nn");
}
/* CHANGE: matrix is returned */
return matrix;
}
这有一个稍微不同的使用模式:
int main(int argc, char **argv){
int m=5, n=4; // matrix[5][4]
int a=50, b=20; // range: 20-50
/* CHANGE: imatrix returns the new matrix */
int **matrix = imatrix(m, n, a, b);
/* CHANGE: check for failure */
if (matrix == NULL) {
fprintf(stderr, "%sn", "imatrix failed to allocate memory.");
exit(1);
}
print(matrix, m, n);
/* TODO: Free the storage allocated for matrix */
}
注释
在整个代码中,我将malloc的用法从:
lvalue = (RedundantCast*)malloc(count * sizeof(FixedType));
习惯用法C:
lvalue = malloc(count * sizeof(*lvalue));
malloc
的返回值的显式强制转换在C中充其量是没有意义的,因为malloc
返回void*
,而C很乐意将void*
自动转换为任何类型的指针。使用目标指向的对象的类型(sizeof(*lvalue)
(,而不是插入特定的类型,可以防止该类型在将来的编辑中发生更改,并且在对malloc
的所有调用中都忘记了进行更改。(例如,考虑一下如果您决定将matrix
设为long long
的矩阵而不是int
,会发生什么。(