簡體   English   中英

在void函數中創建的動態數組的賦值不會在main()中返回相同的值

[英]assigned value to dynamic array created in void function doesnt return the same value in main()

我在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;
}

問題出在無效的masyvas和printf skaicia [2]中-我給skaiciai [2]指定了一個值,但它卻打印了一個隨機值。 我如何解決它?

編輯:謝謝您的回答和解釋,它確實對我有很大幫助! 我知道已經解決了我的問題,最重要的是,我首先知道為什么這是一個問題。

您需要在此處傳遞指針到指針,而無需返回任何內容。

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

當您聲明int *skaiciai ,變量是一個指向int類型的指針。 skaiciai的地址指向一個int。 傳遞&skaiciai ,您傳遞的是指向int的地址的地址。 因此,因為這是地址的地址,所以它是雙指針。

首先,您應該將變量和文本翻譯成英語(您的代碼中沒有注釋,這也應適用於它們)。

接下來,您的masyvas()函數返回一個指向分配的數組的指針(為什么void * 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);

如果您聽不懂這些東西,我想您應該閱讀有關內存,分配和指針的更多信息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM