我将尝试在代码片段中提供足够的信息,因为大部分内容与问题无关。如果您需要更多代码,请与我们联系。
我试图使用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很陌生,很想知道为什么会这样。我的两个假设如下:
分配给值的内存包含这些大数字,并且由于某种原因,row和col没有被设置为矩阵txt文件中的值。
正在打印的是行和列的地址。
如果是场景1的情况,那么在设置row和col的值时我做错了什么?是否有一点我应该操纵指针?
答案 0 :(得分:5)
您未能将row
和col
声明为整数指针...
您的声明应该是
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 *
(在大多数系统上,在其他系统上,它可以是相同的大小),但后者不赞成。