Как распределить массив в функции, а затем перераспределить его - PullRequest
0 голосов
/ 11 мая 2018

Я хочу передать указатель массива на функцию, затем malloc и перераспределить ее. Функция завершается, но после того, как я получаю сообщение об ошибке сегментации (сбрасывается ядро), прежде чем вернуться к основному.

Я не слишком знаком с указателями C, я использовал в основном C ++ для своих кодов, не знаю, как использовать указатели в качестве ссылок.

Main:

#include <stdio.h>
#include <stdlib.h>
#include "header.h"

int main(){
int A[]={1,2,4,5,7};
int B[]={1,2,3,4,6,8};
int *C=NULL;
int k=0;
egyesit(A,B,C,5,6,&k);
int i;
for (i = 0; i < k; i++)
    {
        printf("%d ", C[i]);
    }
    printf("\n");
return 0;

Заголовок:

void egyesit(int *A, int *B, int *C, int n,int m,int *k);

Функция в другом файле c:

#include <stdio.h>
#include <stdlib.h>
void egyesit(int *A, int *B, int *C, int n, int m, int *k)
{
    int i, j;
    C = (int *)malloc(n * sizeof(int));
    *k = n;
    for (i = 0; i < n; i++)
    {
        printf("%d ", A[i]);
        C[i] = A[i];
    }
    printf("\n");

    for (i = 0; i < *k; i++)
    {
        printf("%d ", C[i]);
    }
    printf("\n");

    int ok;
    for (i = 0; i < m; i++)
    {
        ok = 1;
        printf("%d ", B[i]);
        for (j = 0; j < *k; j++)
        {
            if (C[j] == B[i])
            {
                ok = 0;
                break;
            }
        }
        if (ok == 1)
        {
            *k=*k+1;
            C = (int *)realloc(C, *k * sizeof(int));
            C[*k - 1] = B[i];
        }
    }
    printf("\n");
    for (i = 0; i < *k; i++)
    {
        printf("%d ", C[i]);
    }
    printf("\n");
}

Ответы [ 3 ]

0 голосов
/ 11 мая 2018

Или вы можете просто вернуть указатель на память, выделенную в функции eyesgit(), как в

int *egyesit(int *A, int *B, int *C, int n, int m, int *k)
{
    int i, j;
    C = malloc(n * sizeof(int));

    ....
    ....
    ....


    return C;
}

и в main(),

C=egyesit(A,B,C,5,6,&k);

Но нене забудьте освободить память, как только вы закончите, используя ее, как

free(C);

Вам не нужно явно приводить возвращаемое значение malloc().Прочитайте этот пост.

malloc() и realloc() вернет NULL, если есть какая-либо ошибка, например, нехватка памяти.Вы также можете проверить это.

0 голосов
/ 11 мая 2018

Ошибка сегментации в вашей функции egyesit в первом цикле for

*C[i] = A[i];

Это потому, что вы выделили переменную C следующим образом:

*C = (int *)malloc(n * sizeof(int));

C - указатель на указатель на int... int ** C

Таким образом, вы должны сначала выделить память следующим образом

C =(int**)malloc(sizeof(int*));

После этого вы выделяете память для массива типа int, на который указывает C

//*C meaning you are dereferencig on what C is pointing, and allocate memory for that
*C=(int*)malloc(sizeof(int)*n));

Вот так это должно выглядеть

 void egyesit(int *A, int *B, int *C, int n, int m, int *k)
 {
     int i, j;
     C = (int **)malloc(sizeof(int*));
     *C = (int*)malloc(sizeof(int)*n);
     *k = n;
     for (i = 0; i < n; i++)
     {
         printf("%d ", A[i]);
         C[i] = A[i];
     }
     printf("\n");
     //and the rest of the function
0 голосов
/ 11 мая 2018

Чтобы выделить malloc или realloc momory для C, вы должны передать его адрес функции.Поэтому ваша функция должна быть:

void egyesit(int *A, int *B, int **C, int n,int m,int *k)

, иначе указатель, выделенный в egyesit, не будет установлен в переменной C, объявленной в main.

Так ваша функция станетэто:

void egyesit(int *A, int *B, int **C, int n, int m, int *k)
{
    int i, j;
    *C = (int *)malloc(n * sizeof(int));
    *k = n;
    for (i = 0; i < n; i++) {
        printf("%d ", A[i]);
        (*C)[i] = A[i];
    }
    printf("\n");

    for (i = 0; i < *k; i++) {
        printf("%d ", (*C)[i]);
    }
    printf("\n");

    int ok;
    for (i = 0; i < m; i++) {
        ok = 1;
        printf("%d ", B[i]);
        for (j = 0; j < *k; j++) {
            if ((*C)[j] == B[i]) {
                ok = 0;
                break;
            }
        }
        if (ok == 1) {
            *k = *k + 1;
            *C = (int *)realloc(*C, *k * sizeof(int));
            (*C)[*k - 1] = B[i];
        }
    }
    printf("\n");
    for (i = 0; i < *k; i++) {
        printf("%d ", *C[i]);
    }
    printf("\n");
}

А потом вы звоните из main следующим образом:

egyesit(A, B, &C, 5, 6, &k);
...