【问题标题】:makes pointer(integer) from integer(pointer) without a cast从整数(指针)生成指针(整数)而不进行强制转换
【发布时间】:2021-01-19 22:26:24
【问题描述】:
#include<stdio.h>
#include<stdlib.h>

int **transpose(int a[], int b[], int raw, int column){
    int i, j;
    for(i=0; i < raw ; i++)
        for(j=0; j < column ; j++)
            *(b+(j*raw + i)) = *(a+(i*column + j));
    return *b;
}

int **mk_matrix(int raw, int col){
    int i;
    int **matrix = (int**)malloc(sizeof(int*)*raw);
    matrix[0] = (int*)malloc(sizeof(int)*(raw*col));
    for(i=1 ; i < raw ; i++)
        matrix[i] = matrix[i-1] + col;
    
    return matrix;
}

void main(void){
    int r, c, i, j;
    
    printf("Input the size of matrix : ");
    scanf("%d %d", &r, &c);
    
    int **matrix = mk_matrix(r, c);
    int **trans_matrix = mk_matrix(c, r);
    
    printf("Input elements of the %dx%d matrix : ", r, c);
    for(i=0; i < r ; i++)
        for(j=0; j < c ; j++)
            scanf("%d", &matrix[i][j]);
    
    **trans_matrix = transpose(matrix[0], trans_matrix[0], r, c);
    
    for(i=0; i < c ; i++){
        for(j=0; j < r ; j++)
            printf("%d ", trans_matrix[i][j]);
        printf("\n");
    }
}

在 dev c++ 中,此代码按我的意愿正确运行,但它来了

  1. return 使指针从整数不进行强制转换 -> return *b;
  2. 赋值从没有强制转换的指针生成整数 -> **trans_matrix = transpose(matrix[0], trans_matrix[0], r, c); 警告。

如何修复我的代码不显示警告?

【问题讨论】:

  • 您在单机环境中使用微控制器工作?如果没有,对于初学者C11 Standard - §5.1.2.2.1 Program startup(p1) 适用。另请参阅:What should main() return in C and C++?。此外,b 已经是指向int 的指针。 C11 Standard - 6.3.2.1 Other Operands - Lvalues, arrays, and function designators(p3) 所以试图返回 *b 试图返回类型 int
  • 在编译时,始终启用警告,然后修复这些警告。 (对于gcc,至少使用:-Wall -Wextra -Wconversion -pedantic -std=gnu11)注意:其他编译器使用不同的选项来产生相同的结果。通过编译器传递 OPs 代码会导致 4 个主要警告。你需要修复这些警告,事实上,编译的结果不是你想要的。
  • OT:关于:void main(void){ 根据 C 标准,main() 只有 2 个有效签名。它们是:int main( void )int main( int argc, char *argv[])

标签: c


【解决方案1】:

你不需要

返回 *b

int **transpose(int a[], int b[], int raw, int column)

只需将上面修改为

void transpose(int a[], int b[], int raw, int column){
    int i, j;
    for(i=0; i < raw ; i++)
        for(j=0; j < column ; j++)
            *(b+(j*raw + i)) = *(a+(i*column + j));
}

在主函数中

**trans_matrix = transpose(matrix[0], trans_matrix[0], r, c);

transpose(matrix[0], trans_matrix[0], r, c);

因为转置函数已经对 trans_matrix 进行了必要的更改。您无需返回。

这将解决警告问题。

【讨论】:

    【解决方案2】:

    在函数transpose() 中,当transpose()返回类型ptr to ptr to int 时,您将返回ptr to int。现在因为您返回了错误(非预期)数据类型的值,所以您收到了第二个警告。

    另一件事是,当您在transpose() 函数中处理矩阵的地址时,您不需要return 任何类型的值,因为最终您正在更改存储在该地址上的值。您没有处理该值的副本。这就是为什么您不需要:

    **trans_matrix = transpose(matrix[0], trans_matrix[0], r, c);

    我不知道您为什么将函数过于复杂化。你可以把它们写成:

    int transpose(int **a, int **b, int row, int column)
    {
        int i, j;
        for(i=0; i < column ; i++)
            for(j=0; j < row ; j++)
                b[i][j] = a[j][i];
        return 0;
    }
    

    int **mk_matrix(int row, int col)
    {
        int i;
        int **matrix = malloc(sizeof(int*)*row);
    
        for(i=0; i<row; i++)
            matrix[i] = malloc(sizeof(int)*(col));
    
        return matrix;
    }
    

    而在 main() 中,您只需要修改调用 transpose() 方法的方式:

    transpose(matrix, trans_matrix, r, c);

    P.S.另外,请检查您请求的内存空间(malloc())是否已分配给 ptr。

    【讨论】:

      猜你喜欢
      • 2023-02-08
      • 2022-01-05
      • 1970-01-01
      • 2012-06-09
      • 2017-05-06
      • 1970-01-01
      • 1970-01-01
      • 2015-01-19
      • 2021-07-12
      相关资源
      最近更新 更多