![](/img/trans.png)
[英]My void function returns a value and does not return to the main function.
[英]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.