![](/img/trans.png)
[英]Why am I getting this segmentation fault in my code while iterating through large quantities of int values?
[英]C - Why are my int values extremely large?
我将尝试在代码片段中提供足够的信息,因为其中大多数与问题无关。 如果您需要更多代码,请告诉我。
我正在尝试使用fscanf从txt文件读取内容,以制作矩阵。 该文件的格式如下:
(整数声明行数)
(整数声明的列数)
(值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);
打印出的值虽然有所不同,但始终很大,例如“ 5977072 5977088”或“ 4797424 4797440”。 我对C很陌生,很想知道为什么会这样。 我的两个假设如下:
为这些值分配的内存首先包含这些大数字,并且由于某种原因,未将row和col设置为矩阵txt文件中的值。
正在打印的是行和列的地址。
如果是场景1,那么在设置row和col的值时我做错了什么? 我应该在某些时候操纵指针吗?
您未能将row
和col
声明为指向整数的指针...
您的声明应该看起来像
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 *
(在大多数系统上,在其他系统上,它的大小可以相同),但对于后者却不屑一顾。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.