我将尝试在代码片段中提供足够的信息,因为大部分内容与问题无关.如果您需要更多代码,请与我们联系.
我试图使用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);
Run Code Online (Sandbox Code Playgroud)
打印出的值有所不同,但总是非常大,即"5977072 5977088"或"4797424 4797440".我对C很陌生,很想知道为什么会这样.我的两个假设如下:
为值分配的内存包含这些大数字,并且由于某种原因,row和col未被设置为矩阵txt文件中的值.
正在打印的是行和列的地址.
如果是场景1的情况,那么在设置row和col的值时我做错了什么?是否有一点我应该操纵指针?
您未能声明row并col指向整数...
你的声明应该是这样的
int *row, *col;
Run Code Online (Sandbox Code Playgroud)
因此,您只是生成随机垃圾数据.
更新:指针是C的一个关键方面.指针的最简单定义是它指向一个内存区域.
使用时malloc(n),它会找到一个n不大的未使用内存区域.因此,因为您使用过malloc,您必须将结果存储在指针中.
指针对于返回多个值也很有用,例如scanf可以将指针传递给用户希望用返回值填充的内存区域.这就是你使用scanf这样的原因:
int row, col;
scanf("%d %d", &row, &col);
Run Code Online (Sandbox Code Playgroud)
或者,您可以像在问题中一样在堆上进行分配:
int *row = malloc(sizeof(int));
int *col = malloc(sizeof(int));
scanf("%d %d", row, col);
Run Code Online (Sandbox Code Playgroud)
两种方式都是完全合法的.虽然,对于数据类型,例如int恰好小于int *(在大多数系统上,在其他系统上,它可以是相同的大小),后者是不赞成的.