2012-01-10 5 views
0

mallocを使用して文字列でポインタ配列を埋める方法が残っています。デバッグでは、配列の1番目のポインタを文字列で埋めると、1番目と2番目の要素の次の文字列が次のポインタに渡されます。ptr[i]=buff; ptrのように見えますバフ配列に表示され続けます。Cでmallocとバッファを使用している文字列を持つポインタ配列

#include<stdlib.h> 
    #include<string.h> 
    #define size 2  //array of 2 pointers 
    int main() 
{ 
    int i; 
    char *ptr[size]; 
    char buff[80]; 

    for (i=0;i<size;i++) 
    { 
     memset(buff, 0, sizeof(char) * 80); 
     printf("Enter name:\n");fflush(stdout); 
     scanf("%s",buff); 

     ptr[i]=(char*)malloc(strlen(buff)); 
     //ptr[i]=buff;      //that was the mistake 
     strncpy(ptr[i], buff, strlen(buff)); //->correct answer! 
     printf("length %d\n",strlen(buff)); 
    } 
    for (i=0;i<size;i++) 
    { 
     printf("prt[%d]=%s\n",i,ptr[i]);fflush(stdout); 
    } 
    for (i=0;i<size;i++) 
    { 
     free(ptr[i]); 
    } 
    return 0; 
} 

私が持っている別の奇妙な質問は、一般的に配列の長さと関係があります。配列が例えばa[10]と宣言された場合、ポインタaは配列の最初の要素を指し示します。私は理解していないものは、長さが格納されている場所です!それはポインタの前のメモリアドレスですか?以前ですか?それともコンパイラだけと関係がありますか?おかげさまで あまりにも私が尋ねたwasntを願っています。 :)

+0

良い本であればCの文字列を読み上げるべきです。やや難しい話題かもしれません。 – Joe

+1

あなたが言ったように、配列が[10]と宣言されたとき、ポインタは最初の要素のアドレスを指します。しかし、長さはどこにも保存されていません。 10バイトしか使用しないことを確認するのはプログラマの仕事です!アレイのa。より一般的には、使用する配列の場合、配列の長さはプログラムによって維持されなければなりません。 – Finslicer

+0

配列の問題を修正しましたが、元のメッセージの後にいくつかの迷惑メールが印刷されています...誰かがコードplzコメントの間違いを見ることができます。ありがとう – BugShotGG

答えて

4

この:

ptr[i]=buff; 

は、文字列をコピーしません。ポインタをコピーするだけです。だからあなたはメモリリークを引き起こしていません(今割り当てたメモリにアクセスする方法はありません)が、ptr[i]は今度はbuffを指しているので、プログラムがうまくいきません。新しい文字列を読むたびに、 ptr[]のすべての要素。

代わりにこれを行います。それはgetsを使用するには、悪い習慣と考えられていますということも

strncpy(ptr[i], buff, BUF_SIZE); 

注意。ユーザーが9文字以上の文字列を入力するとどうなるか考えてみてください。

+0

ありがとう!私は配列を使用してscanf()を使用する方法を知らなかったために使用されます。今それを理解しようとしています。おそらくforループなどで – BugShotGG

+0

heyoコードにはまだ問題があります。何らかの理由で私は元の文字列の後にいくつかのジャンクを印刷します。悪いmallocのせいかもしれませんか? – BugShotGG

1

次は正しくありません。

ptr[i]=buff 

かわり割り当てのstrcpy()を使用する必要があります。

そうしないと、ptrのすべての要素に同じポインタを割り当てるmalloc() EDメモリリークが発生し、あなたがmalloc()編を持っていないfree()ものにしてみてください。

関連する問題