本练习的目的是使用动态内存分配的双下标方法。 该程序的输入是位于名为的文件中的浮点数据的二维数组 testdata2。输入数组将包含3行数据,每行包含5列数据。
#include <stdio.h>
#include <stdlib.h>
int main()
{
FILE *fp;
int temp;
int number;
int r = 3;
int c = 5;
fp = fopen("testdata2.txt", "r");
number = (int)malloc(r * c * sizeof(int));
while (fscanf(fp, "%d", &temp) != EOF){
for(int i = 0; i < 3;i++){
for(int j = 0; j < 5; j++){
temp = number[i][j];
}
}
}
return(0);
}
答案 0 :(得分:1)
在您的代码中存在大量不正确的事情(其中任何一个都可能导致未定义的行为):
int
。malloc
in C isn't necessary, nor advised。temp = ...
的作业语句也是向后。您希望将刚刚读取的值保存到矩阵中,而不是将其丢弃并用您刚刚分配的内存中未定义的值覆盖它。所有这些都说,知道数组数组的宽度为5,问题就减少了。注意temp
根本不需要
#include <stdio.h>
#include <stdlib.h>
int main()
{
static const size_t r = 3;
static const size_t c = 5;
FILE *fp = NULL;
double (*number)[c] = NULL; // pointer to array of dimension c.
fp = fopen("testdata2.txt", "r");
if (fp == NULL)
{
perror("Failed to open file: ");
return EXIT_FAILURE;
}
number = malloc(r * sizeof *number); // allocate r-rows of dimension c
if (number == NULL)
{
perror("Failed to allocate array of arrays: ");
return EXIT_FAILURE;
}
for (size_t i=0; i<r; ++i)
{
for (size_t j=0; j<c; ++j)
{
if (fscanf(fp, "%lf", number[i]+j) != 1)
{
fprintf(stderr, "Failed to parse int at %zu,%zu", i, j);
return EXIT_FAILURE;
}
}
}
for (size_t i=0; i<r; ++i)
{
for (size_t j=0; j<c; ++j)
printf("%lf ", number[i][j]);
fputc('\n', stdout);
}
free(number);
return(0);
}
答案 1 :(得分:0)
您正在声明一个整数:
int number;
并且您正在使用malloc分配内存,假设它是一个多维数组,然后尝试以相同的方式访问其元素。 将声明更改为:
int **number;
答案 2 :(得分:0)
它不是
(INT)的malloc(R C 的sizeof(int)的)
是
(int *)malloc(r c sizeof(int))
另一个错误是您无法以
的形式访问元素温度=数[i] [j];
将其替换为
温度=数[I * R + j]的
希望这有帮助
答案 3 :(得分:0)
number = (int)malloc(r * c * sizeof(int));
在C中,永远不会转换malloc的结果。如果你把演员阵容遗漏到了int,你会在这里有一个诊断,告诉你这个数字不是指针类型。
你可以这样做:
int* number = malloc(r * c * sizeof(int));
但是这会给你一个大的单维数组。你需要像这样取消引用它:
temp = number[i * c + j];
如果你想要二维索引,就好像你已经这样声明了它:
int number[r][c];
您需要分两个阶段进行分配:
int** number = malloc(r * sizeof(int*));
number[0] = malloc(r * c * sizeof(int));
for (int i = 1 ; i < r ; i++)
{
number[i] = &number[0][i * c];
}
设置了一个大的int数组和一个指向每行的int的中间指针数组。现在你可以做到
temp = number[i][j];
修改强>
或者你可以做Dmitri所说的:
int (*number)[c] = malloc(r * c * sizeof(number[0][0]));
实际上,它可以一次性地对一组r个块进行malloc。