2016-04-09 10 views
0

conjuntoと呼ばれる大きな配列に、vetor1,vetor2vetor3という3つの配列を追加する必要がありますが、コードを実行するとセグメンテーションフォルトが発生します。セグメンテーションフォールトを続ける

私は50の位置の配列を作成し、この配列を0で埋めるために関数iniciaizaを使用します。次に、関数readで配列を読み込みます(ほとんどの場合、配列のサイズは3になります)。私はmallocを使用して作成したものに3つの配列をコピーする必要があります。最終的には、3つのアレイとその3つすべてのコピーを印刷する必要があります。あなたの関数で

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

int *conjunto; 
int *vetor1, *vetor2, *vetor3, n1, n2, n3; 
int tam = 50; 

void inicializa (int **tconj, int tam) 
{ 
    int i; 
    *tconj = (int *) malloc (tam * sizeof(int)); 
    for (i = 0; i < tam; i++) 
    { 
     tconj[i] = 0; 
    } 
} 

void read (int **vec, int *n) 
{ 
    int i; 
    printf("size of array: "); 
    scanf ("%d", n); 
    printf("array: \n"); 
    *vec = (int *) malloc (*n * sizeof(int)); 
    for (i = 0; i < *n; i++) 
    { 
     scanf ("%d", &(*vec)[i]); 
    } 
} 

void add (int *conjunto, int *vetor1, int *vetor2, int *vetor3, int n1, int n2, int n3) 
{ 
    int i, j, k, w; 
    int fim1 = (n1 + n2); 
    int fim2 = (n1 + n2 + n3); 
    for (i = 0; i < n1; i++) 
    { 
     conjunto[i] = vetor1[i]; 
    } 
    for (j = n1; j < fim1; j++) 
    { 
     conjunto[j] = vetor2[j]; 
    } 
    for (k = fim1; k < fim2; k++) 
    { 
     conjunto[k] = vetor3[k]; 
    } 
} 

void print_array (int *vec, int n) 
{ 
    int i; 
    printf("array: "); 
    for (i = 0; i < n; i++) 
    { 
     printf("%d ", vec[i]); 
    } 
    printf("\n"); 
} 

int main() 
{ 
    inicializa (&conjunto, tam); 

    read (&vetor1, &n1); 
    read (&vetor2, &n2); 
    read (&vetor3, &n3); 

    print_array (vetor1, n1); 
    print_array (vetor2, n2); 
    print_array (vetor3, n3); 

    add (conjunto, vetor1, vetor2, vetor3, n1, n2, n3); 

    print_array (conjunto, tam); 

    return 0; 
} 
+1

だから**正確に**セグメンテーションは起こりますか? –

+0

'未使用変数 'w' [-Werror = unused-variable]' – jdarthenay

+0

プログラムを実行すると、3つの配列をすべて読み取って印刷できますが、コードはコピーを作成していません。私はwを消すのを忘れた。 – fmbra

答えて

2

あなたの初期化関数は、ちょうど小さな星が欠落している、ほとんど良いのバウンドの外にすることができvetor2[j];vetor3[k];が、jkを読んでいる:

void inicializa (int **tconj, int tam) 
{ 
    int i; 
    *tconj = (int *) malloc (tam * sizeof(int)); 
    for (i = 0; i < tam; i++) 
    { 
     (*tconj)[i] = 0; 
    } 
} 

また、この方法で入力を読み込んだら、メインで呼び出す必要があります。

tam = n1 + n2 + n3; 
inicializa (&conjunto, tam); 

、プログラムの終了時に、return前に、あなたが追加する必要があります:

free(conjunto); 
free(v1); 
free(v2); 
free(v3); 

編集を:私はadd()に他の二つのバグを逃しました。

void add (int *conjunto, int *vetor1, int *vetor2, int *vetor3, int n1, int n2, int n3) 
{ 
    int i, j, k; 
    int fim1 = (n1 + n2); 
    int fim2 = (n1 + n2 + n3); 
    for (i = 0; i < n1; i++) 
    { 
     conjunto[i] = vetor1[i]; 
    } 
    for (j = n1; j < fim1; j++) 
    { 
     conjunto[j] = vetor2[j - n1]; 
    } 
    for (k = fim1; k < fim2; k++) 
    { 
     conjunto[k] = vetor3[k - fim1]; 
    } 
} 

編集2:ユーザーが面白い値(0または負のサイズの配列など)を追加しても機能しません。これらのコントロールを残します。

+0

ありがとう、今私はセグメンテーションの障害を取得していません:) – fmbra

1
for (i = 0; i < tam; i++) 
{ 
    // This is not doing what you think it is. 
    // You are setting some memory locations at and after tconj to zero, 
    // which is not the array you just allocated. 
    // The pointer to array that you just allocated is now 0 
    tconj[i] = 0; // pretty sure you mean *tconf[i] 
} 
関連する問題