C 调用使用指针接收数组的函数

C 调用使用指针接收数组的函数,c,arrays,pointers,C,Arrays,Pointers,所以我有这个: 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;

所以我有这个:

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]);
        }
    }
}
void-fillPreferences(int-pref[][],int-size)
{

对于(int i=0;i而言,您的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;
}
#包括
#包括
void fillPreferences(整数**pref,整数大小)
{
int prefNum=0;

对于(inti=0;i当你写
a[i]
时,它变成
*(a+i)
。也就是说,
a[i]
通过
a+i
地址访问内存(它是
a+i*sizeof(element)
偶数)

因此,
a[i][j]
意味着
*(*(a+i)+j)
两次内存访问。要实现这一点,您的
a
应该是一个数组数组。也就是说,您需要先
malloc
它的元素,然后
malloc
一个内存来容纳它们


在您的特殊情况下,我怀疑您是否需要它。您需要的是将其设置为1D数组(已经是了),并根据您的两个索引以任何方式计算索引。

您为1D数组分配内存,但您拥有的函数设计为接受2D数组并填充它(尽管函数定义不正确,无法编译)

更正代码:

#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;
}
#包括
#包括
void fillPreferences(整数**pref,整数大小)
{
对于(int i=0;i
没有2D数组。也没有指针数组或类似的数组。而且函数不接受“指向数组的指针”。我做错了什么?我该如何修复它?
void fillPreferences(int pref[],int size){for(int I=0;I首先,创建一个2D数组。我需要接收如下输入:{1 2 3}{2 4 3}{5 2 4}-2D数组。非常感谢!!我有没有办法只使用void fillPreferences(int[]pref,int size)来完成你在那里做的事情?因为我被要求使用这个声明。。