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

时间:2014-09-07 14:43:47

标签: c integer

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

我试图使用fscanf读取txt文件以制作矩阵。该文件的格式如下:

(整数声明行数)

(整数声明列数)

(value1,value2,......,value 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);

打印出的值有所不同,但总是非常大,即" 5977072 5977088,"或" 4797424 4797440。"我对C很陌生,很想知道为什么会这样。我的两个假设如下:

  1. 分配给值的内存包含这些大数字,并且由于某种原因,row和col没有被设置为矩阵txt文件中的值。

  2. 正在打印的是行和列的地址。

  3. 如果是场景1的情况,那么在设置row和col的值时我做错了什么?是否有一点我应该操纵指针?

1 个答案:

答案 0 :(得分:5)

您未能将rowcol声明为整数指针...

您的声明应该是

int *row, *col;

因此,您只是生成随机垃圾数据。

更新指针是C的一个重要方面。指针的最简单定义是它 points 到一个记忆区域。

当您使用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 *(在大多数系统上,在其他系统上,它可以是相同的大小),但后者不赞成。