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

时间:2016-01-16 15:49:05

标签: 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;

    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数组。
谢谢:))

3 个答案:

答案 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;
}