C 为什么我的int值非常大?

C 为什么我的int值非常大?,c,integer,C,Integer,我将尝试在代码片段中提供足够的信息,因为其中大部分与问题无关。如果您需要更多代码,请告诉我 我试图从一个txt文件读取使用fscanf,以便使一个矩阵。文件格式如下: (声明行数的整数) (声明列数的整数) (值1,值2,…,值n) (最后一行值) 我使用以下代码(剔除不相关项)获得矩阵中的行数和列数: FILE* fp; int row,col; row = (int) malloc(sizeof(int)); col = (int) malloc(sizeof(int));

我将尝试在代码片段中提供足够的信息,因为其中大部分与问题无关。如果您需要更多代码,请告诉我

我试图从一个txt文件读取使用fscanf,以便使一个矩阵。文件格式如下:

(声明行数的整数)

(声明列数的整数)

(值1,值2,…,值n)

(最后一行值)

我使用以下代码(剔除不相关项)获得矩阵中的行数和列数:

FILE* fp;
int row,col;    

row = (int) malloc(sizeof(int));
col = (int) malloc(sizeof(int));

fp = fopen(fname, "r");
fscanf(fp, "%d %d", row, col);
printf("%d %d \n", row, col);
打印出来的值各不相同,但总是非常大,即“59770725977088”或“4797424797440”。我对C比较陌生,很想知道为什么会发生这种情况。我的两个假设如下:

  • 为包含这些大数字的值分配的内存,由于某些原因,row和col未设置为矩阵txt文件中的值

  • 正在打印的是行和列的地址


  • 如果是场景1,那么我在设置行和列的值时做错了什么?是否应该在某个点操作指针?

    您未能将
    声明为指向整数的指针

    你的声明应该是

    int *row, *col;
    
    因此,您只是在生成随机垃圾数据

    更新:指针是C语言的一个重要方面。指针最简单的定义是它指向内存区域

    当您使用
    malloc(n)
    时,它会发现一个不间断的未使用内存区域,其大小为
    n
    字节。因此,由于使用了
    malloc
    ,因此必须将结果存储在指针中

    指针对于返回多个值也很有用,可以将
    scanf
    等函数的指针传递给用户希望用返回值填充的内存区域。这就是为什么要这样使用
    scanf

    int row, col;
    scanf("%d %d", &row, &col);
    
    或者,您也可以像在问题中那样在堆上进行分配:

    int *row = malloc(sizeof(int));
    int *col = malloc(sizeof(int));
    scanf("%d %d", row, col);
    

    这两种方式都是完全合法的。虽然,对于像
    int
    这样恰好小于
    int*
    的数据类型(在大多数系统上,在其他系统上,它的大小可以相同),后者是不受欢迎的。

    您没有将
    声明为指向整数的指针

    你的声明应该是

    int *row, *col;
    
    因此,您只是在生成随机垃圾数据

    更新:指针是C语言的一个重要方面。指针最简单的定义是它指向内存区域

    当您使用
    malloc(n)
    时,它会发现一个不间断的未使用内存区域,其大小为
    n
    字节。因此,由于使用了
    malloc
    ,因此必须将结果存储在指针中

    指针对于返回多个值也很有用,可以将
    scanf
    等函数的指针传递给用户希望用返回值填充的内存区域。这就是为什么要这样使用
    scanf

    int row, col;
    scanf("%d %d", &row, &col);
    
    或者,您也可以像在问题中那样在堆上进行分配:

    int *row = malloc(sizeof(int));
    int *col = malloc(sizeof(int));
    scanf("%d %d", row, col);
    

    这两种方式都是完全合法的。尽管对于像
    int
    这样的数据类型,它恰好小于
    int*
    (在大多数系统上,在其他系统上,它的大小可以相同),后者是不受欢迎的。

    请使用所有警告和调试信息进行编译(例如
    gcc-Wall-g
    ),并学习如何使用调试器(例如
    gdb
    )。为什么要从堆中为
    分配内存?因为否则我的程序会崩溃。当它尝试扫描时,我相信它没有地方放置值,因此它会崩溃。请使用所有警告和调试信息(例如
    gcc-Wall-g
    )进行编译,并学习如何使用调试器(例如
    gdb
    )。为什么要从堆中为
    分配内存?因为否则我的程序会崩溃。当它尝试扫描时,我相信它没有任何地方可以放置值,因此它会崩溃。是否有一些阅读资料可以帮助我更好地理解这一点?老实说,我只是不知道什么时候应该声明为指针。@ChristianBaker查看我的更新,以获取有关指针使用的小指南。对于更高级的用法,最好的学习方法是查看主要库(如zlib)的头文件。是否有一些阅读资料可以帮助我更好地理解这一点?老实说,我只是不知道什么时候应该声明为指针。@ChristianBaker查看我的更新,以获取有关指针使用的小指南。对于更高级的用法,最好的学习方法是查看zlib等主要库的头文件。