所以我是这样的:
int main()
{
int workers;
printf("How many workers are there?\n");
scanf("%d", &workers);
printf("What are their preferences?\n");
int *pref = malloc(workers * sizeof(int));
if (pref == NULL)
return -1;
fillPreferences(pref, workers);
return 0;
}
我现在想要填写" pref"这个函数中的2d数组:
void fillPreferences(int pref[][], int size)
{
for (int i=0;i<size;i++)
{
for (int j=0;j<size;j++)
{
scanf(" %d", &pref[i][j]);
}
}
}
它不起作用,可能是因为我使用错误的指针。我怎样才能使用malloc然后调用一个函数并通过pref [i] [j]接收二维数组中的值? (请注意,我不想做像scanf(...,&amp; pref + i)或其他什么。我需要实际使用那个2d数组。
谢谢:))
答案 0 :(得分:1)
当您撰写a[i]
时,它会变为*(a+i)
。也就是说,a[i]
通过a+i
地址访问内存(嗯,甚至是a+i*sizeof(element)
)。
因此,a[i][j]
表示*(*(a+i)+j)
。 两次内存访问。为此,a
应该是一个数组数组。也就是说,您需要首先malloc
其元素,然后malloc
一个内存来保存它们。
在您的特定情况下,我怀疑您是否需要它。你需要的是使它成为一维数组(已经是它)并以你想要的任何方式从你的两个指数计算索引。
答案 1 :(得分:0)
你的pref数组是1D所以你可以这样做:
#include <stdio.h>
#include <stdlib.h>
void fillPreferences(int **pref, int size)
{
int prefNum=0;
for (int i=0;i<size;i++)
{
puts("Number of preferences");
scanf("%d",&prefNum);
pref[i]=malloc(sizeof(int)*prefNum);
puts("Enter preferences");
for(int j=0;j<prefNum;j++){
scanf(" %d", &pref[i][j]);
}
}
}
int main()
{
int workers;
printf("How many workers are there?\n");
scanf("%d", &workers);
printf("What are their preferences?\n");
int **pref = malloc(workers * sizeof(int *));
if (pref == NULL)
return -1;
fillPreferences(pref, workers);
// Show values
printf("%d %d %d",pref[0][0],pref[1][0],pref[2][0]);
return 0;
}
答案 2 :(得分:0)
您为一维数组分配内存,但您拥有的功能旨在接受一个二维数组并填充它(尽管函数定义不正确且无法编译)。
更正后的代码:
#include <stdio.h>
#include <stdlib.h>
void fillPreferences(int** pref, int size)
{
for (int i = 0; i < size; i++)
{
for (int j = 0; j < size; j++)
{
scanf("%d", &pref[i][j]);
}
}
}
int main()
{
int workers;
printf("How many workers are there?\n");
scanf("%d", &workers);
printf("What are their preferences?\n");
int **pref = malloc(workers * sizeof(int*));
if (pref == NULL)
return -1;
for(int i = 0; i < workers; i++)
{
pref[i] = malloc(workers * sizeof(int));
if(pref[i] == NULL)
{
for(int j = 0; j < i; j++)
free(pref[j]);
free(pref);
return -1;
}
fillPreferences(pref, workers);
/* Don't forget to `free` everything after its use! */
return 0;
}