2016-12-07 9 views
2

私はrealloc()、getchar()とポインタの算術演算を使ってメモリに文字の配列を格納する小さなプログラムを書こうとしています。realloc()、コアのダンプを取得しようとしました

私はcharへのポインタ(main.cで宣言されている、最初はNULLです)を受け取る "inputArray"と呼ばれる関数を持っていて、getchar()が呼び出されるまで1つのcharで再割り当てされます。 '\ n'文字を取得します。関数は正常に動作するようだが、main.cに文字列を戻そうとすると、 "segmentation fault(core dumped)"というエラーが出る。私は何時間も探していて、どこに問題があるのか​​分からない。ありがとう!

のmain.c:

# include "convert.h" 

int main() 
{ 
    char * string = NULL; 
    inputArray(string); 
    printf("%s", string);  
    free(string); 
    return 0; 
} 

convert.c:

#include "convert.h" 

void inputArray(char * array) 
{ 
    /*pointer to the array*/ 
    char * ptr = NULL; 

    /*stores the char*/ 
    char c = 0; 

    /*counter used for pointer arithmetic*/ 
    int count = 0; 

    /*loop for getting chars in array*/ 
    while ((c = getchar()) != '\n') 
    { 
     array = realloc(array, sizeof(char)); 
     ptr = array + count; 
     *ptr = c; 
     ++count; 
    } 

    /*add the null char to the end of the string*/ 
    array = realloc(array, sizeof(char)); 
    ptr += count; 
    *ptr = '\0'; 
} 

CONVERT.H:

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

void inputArray(char * array); 
+4

*をc *で参照してエミュレートすることについて検索して読んでください。 –

+0

'sizeof(char)'は常に1 .....になります(ダブル幅の文字を使用している場合は2つですが、固定サイズです)。 – gilez

答えて

3

新しい割り当て配列のサイズが正しくありません。 count + 1文字を割り当てる必要があります。

array = realloc(array, (count + 1) * sizeof(char)); 

メモリを再割り当てするために一時ポインタを使用する方が安全であることを考慮してください。そうしないと、以前に割り当てられたメモリの元のアドレスが失われます。

はまた、これらのステートメントは

array = realloc(array, sizeof(char)); 
ptr += count; 

は間違っています。あなたは、少なくとも、呼び出し元に新しいポインタを返すようにしなければならない機能が

char * inputArray(char * array); 

のように宣言し、それする必要があります。また

array = realloc(array, count * sizeof(char)); 
ptr = array + count - 1; 

を記述する必要があります。

メインに、あなたは

string = inputArray(string); 

を記述する必要がありそうでない関数は、パラメータが

void inputArray(char ** array); 

のように宣言する必要がありますされており、機能に相応して処理され、参照によって引数を受け入れる必要があります。

2

あなたはinputArray関数の間接のいずれかのレベルが欠落しています。

*array = realloc(*array, (count + 1) * sizeof(char)); 

はこのようにそれを呼び出します(あなたもcount + 1に乗じて、配列のサイズを大きくする必要がある)それは

void inputArray(char **array) 

のように宣言する必要があり、それは次のようにrealloc'dする必要があります。

inputArray(&string); 
+0

@BeyelerStudiosおっと、お急ぎの結果:-) –

+0

@BeyelerStudiosありがとう:-) –

関連する問題