2012-04-11 5 views
1

memsetに静的に割り当てられた文字の配列を返しますが、mallocを使用して割り当てられた同じ長さの配列ではありません。静的に割り当てられたchar配列のC - memset segfault

変数の定義:

//static 
    char inBuff[IN_BUFF_LEN]; 
    //dynamic 
    char * inBuffD; 

関数呼び出し:関数内

//static, cast used because char** != char (*) [n] 
    serverInit(portNum, (char**) &inBuff, &serv_addr, &sockfd) 
    //dynamic 
    serverInit(portNum, &inBuffD, &serv_addr, &sockfd) 

が使用:

memset(*inBuffAdr, 0, IN_BUFF_LEN); 

私は私の問題は、関数呼び出しの違いにあると思われます、より正確に言えば、「char **!= char(*)[n]」状況に関する私の不完全な理解です。しかし、私はこれをあまりにも長い間叩いていて、木から森を見ることができないので、何かヒントやアドバイスをいただければ幸いです。

+1

'inBuffAdr'とは何ですか?どのように設定されていますか? – NPE

+0

それは他の場所で使用されているちょうどいくつかの構造であり、手元の質問にとって重要ではありません。しかし、もしあなたが本当に知りたいのであれば、私はあなたにいくつかの詳細を与えることができます – Zodd

答えて

4

だけinBuff(ない** inBuff)と、その後のmemset inBuffAdrない* inBufAdr(あなたの他のmemsetは、おそらくどちらか動作していない、あなたはまだそれを知らない)

+2

+1 "どちらも動作しないが、あなたはまだそれを知らない"。 –

+0

私は関数の外にポインタ変数を持っていましたが、必要に応じてその値を設定できるようにしていました。つまり、ダブルポインタです。他のmemsetについては、今のところ働いているようですが、私はあなたが何を意味しているか知っています:) – Zodd

0

なぜserverInit()に以下を定義していないを送信方法:

serverInit(...., char * inBuff, ....) 

、このようなserverInit()コールmemset()の内側に、その後

serverInit(...., inBuff, ....) 

それを呼び出すと:

memset(inBuff, 0, IN_BUFF_LEN); 
1

なぜserverInit()関数にダブルポインタを渡す必要がありますか?関数がポインタの指す場所を変更できる場合は、静的に割り当てられた配列を渡すことはできません。関数がポインタの指す場所を変更できない場合は、ダブルポインタは必要ありません。

&inBuffのタイプはIN_BUFF_LENcharの配列へのポインタであり、これはchar **とはまったく異なります。あなたは、あなたがやっていることをあなたがコンパイラよりもよく知っていると主張して、コンパイラを不平を言っていないようにぶち壊しました。あなたがコンパイラ以上のことを知っていない限り、そのようなキャストを使用しないでください。

率直に言って、現在のプロトタイプ与え、あなたはおそらくとオフの最高のだろう:

//static 
char inBuff[IN_BUFF_LEN]; 
char *inBuffS = inBuff; 
//dynamic 
char *inBuffD; 

serverInit(portNum, &inBuffS, &serv_addr, &sockfd); 

しかし、私はあなたが第二のための簡単なchar *の代わりchar **を取るためにserverInit()を改正すべきであることを深く不審なよ引数。

+0

'char **'はおそらくコメントでは間違っていると言われ始めましたが、また、配列サイズ情報を配列で保持することは、サイズを変更したくないと確信している場合を除いて、しばしば良い習慣であると付け加えます。つまり、プロトタイプを 'serverInit(short port、char * buf、size_t bufsize、struct sockaddr * addr、int * fd)'に変更します。そして、実際には、ポインタとなるfdの必要性について質問します。 –

+0

@BrianMcFarland:あなたの言うことに同意します。 'serverInit()'関数が 'fd'をオープンして呼び出し側のコードに戻す場合、ポインタは多かれ少なかれ正当です。しかし、そのような複数のリターンパラメータがある場合、それらをすべて構造体に入れる価値があります。関数は構造体へのポインタをとり、必要に応じて詳細を入力します。問題の1つの問題は、私たちが役立つ答えを出すには十分な文脈しかないことです。 –

+0

前のコメントで述べたように、二重ポインタは、関数内からポインタの値を変更して、値を渡すと切り捨てられないようにするためです。 @JonathanLefflerこれらは複数の戻り値です。私はそれらを構造体に入れますが、これは基本的に最終的な関数のモックアップです。まず、私はそれを動作させたい、後で私はそれを包みます。コンテキストに関しては、私が投稿したコードの周りにはそれほど多くのコードはありません。少なくとも、inBuffAdrの値とやりとりするコードはありません – Zodd

0

&inBuffinBuffになるように逆参照できます。このシンプルなテストプログラムを実行した場合:

#include <stdio.h> 
char inBuff[1000]; 
int main(int argc, char *argv[]) 
{ 
    printf("%p %p\n", inBuff, &inBuff); 
    return 0; 
} 

両方の表記に同じアドレスが出力されていることがわかります。 &inBuffを逆参照しようとすると、配列の最初の数バイトがアドレスとして取得されます。

他にも述べたように、設定しようとしているメモリへのポインタを渡してください。うまくいけば、この答えは将来のデバッグセッションに役立ちます。

関連する問題