在void函数中创建的动态数组的赋值不会在main()中返回相同的值

时间:2015-11-04 20:36:22

标签: c arrays

我在C中遇到了动态数组的问题。我的程序工作正常,但我被要求将动态数组的创建放入单独的空白中。我做了它,它仍然工作得很好,但后来我必须在void中为创建的数组的某个点赋值,并让它返回所述值,但是,我得到的是一个随机值。该函数的工作原理是将指针和所需数组的长度发送到void,然后将指针变为动态数组。

#include <stdio.h>
#include <stdlib.h>
#define MAX 255
void ieskom (int skaiciai[],int n, int *de, int *me, int *n1, int *n2)
{
    int i = 0;
    int j = 0;
    int nr1 = 0;
    int nr2 = 0;
    int temp = 0;
    int temp1 = 0;
    int eile = 0;
    int eile1 = 0;
    int *did;
    did = (int*)calloc(n,sizeof(int));
    if (did==NULL)
    {
        printf("Nepriskirta atminties.");
        exit(0);
    }
    int *maz;
    maz = (int*)calloc(n,sizeof(int));
    if (maz==NULL)
    {
        printf("Nepriskirta atminties.");
        exit(0);
    }
    i = 0;
    for (i = 0; i < n; i++)
    {
        if (skaiciai[i] < skaiciai[i+1])
        {
            did[j] = did[j] + 1;
            if (did[j] > temp)
            {
                eile = j;
                temp = did[j];
                nr1 = i+1;
            }
        }
        else
        {
            did[j] = did[j] + 1;
            if (did[j] > temp)
            {
                eile = j;
                temp = did[j];
                nr1 = i+1;
            }
            j = j + 1;
        }
    }
    j = 0;
    for (i = 0; i < n; i++)
    {
        if (skaiciai[i] > skaiciai[i+1])
        {
            maz[j] = maz[j] + 1;
            if (maz[j] > temp1)
            {
                eile1 = j;
                temp1 = maz[j];
                nr2 = i+1;
            }
        }
        else
        {
            maz[j] = maz[j] + 1;
            if (maz[j] > temp1)
            {
                eile1 = j;
                temp1 = maz[j];
                nr2 = i+1;
            }
            j = j + 1;
        }
    }
    *de = did[eile];
    *me = maz[eile1];
    *n1 = nr1;
    *n2 = nr2;
    free(did);
    free(maz);
}
/*int masyvas(x)
{
    int y;
    y = (int*)malloc(x*sizeof(int));
    return y;
}*/
void *masyvas (int *skaiciai, int n)
{
    *skaiciai = (int*)malloc(n*sizeof(int));
    skaiciai[2] = 5;
    return skaiciai;
}
int main()
{
    int n1 = 0;
    int n2 = 0;
    int de = 0;
    int me = 0;
    int i = 0;
    int n = 0;
    int *skaiciai;
    scanf("%d", &n);
    // skaiciai = masyvas(n); // naudojant int
    masyvas(&skaiciai, n);
    printf("2 = %d", skaiciai[2]);
    if (skaiciai==NULL)
    {
        printf("Nepriskirta atminties.");
        exit(0);
    }
    for (;i < n; i++)
    {
        scanf("%d", &skaiciai[i]);
    }
    ieskom (skaiciai, n, &de, &me, &n1, &n2);
    if (de > me)
    {
        printf("Elementu numeriai:");
        printf(" %d", n1-de+1);
        printf(" %d\n", n1);
        printf("\nAtstumas tarp ju: %d", de-2);
    }
    else
    {
        printf("Elementu numeriai:");
        printf(" %d", n2-me+1);
        printf(" %d\n", n2);
        printf("\nAtstumas tarp ju: %d", me-2);
    }
    free(skaiciai);
    getchar();
    getchar();
    return 0;
}

问题出在void masyvas和printf skaicia [2] - 我为skaiciai [2]指定了一个值,但是它打印出一个随机值。我该如何解决?

编辑:感谢您的回答和解释,这对我帮助很大!我知道已经解决了我的问题,最重要的是,我知道为什么它首先是一个问题。

2 个答案:

答案 0 :(得分:0)

你需要在这里传递一个指向指针,不需要返回任何东西。

void masyvas (int **skaiciai, int n)
{
    *skaiciai = (int*)malloc(n*sizeof(int));
    (*skaiciai)[2] = 5;
}

声明int *skaiciai时,变量是指向int类型的指针。 skaiciai保存指向int的地址。当您通过&skaiciai时,您将传递指向int的地址的地址。因为这是一个地址的地址,它是一个双指针。

答案 1 :(得分:0)

首先,您应该将变量和文本翻译成英语(您的代码缺少评论,这也适用于它们)。

接下来你的masyvas()函数返回一个指向已分配数组的指针(为什么无效*?!)但是当你调用它时你不会得到返回的值。

你必须选择:要么传递指向你的函数的指针(数组是一个指针,如果你想从一个函数中分配一个数组,你必须将指针传递给指针,所以一个int ** ),或者您使用返回的值。

使用返回值进行分配:

// this function allocates a int* tab of size n and set one value
int *allocate_tab(int n) {
  int *tmp;
  tmp = malloc(n*sizeof(int));
  if (tmp == NULL) {
    return(NULL); // failed
  }
  tmp[2] = 5;
  return(tmp);
}
// in main (or other function)
int *mytab;

mytab = alloc_tab(45);

通过将指针传递给数组来进行分配:

void alloc_tab(int **tab, int n) {
  *tab = malloc(n*sizeof(int));
  if (*tab == NULL) {
    return;
  }
  (*tab)[2] = 5;
}
// in main (or other)
int *mytab;
alloc_tab(&mytab, 45);

如果您无法理解这些内容,我想您应该阅读更多有关内存,分配和指针的内容。