1

.hファイルで構造体を次のように宣言しました。

struct node{
char* string;
}

これは、たとえば、stringという名前の文字ポインターという1つのメンバーを持つ構造を作成することを目的としています。

ここで、文字列の長さを把握し、適切なサイズの配列をmallocして、入力を取得します。

char* test;
test = (char*) malloc( n * sizeof(char) );

私の知る限り、これにより文字ポインターテストが作成され、mallocした配列の先頭を指すように割り当てられました。次に、ユーザーが入力した文字に各配列スロットを割り当て、それを読み戻します。これはすべてコンパイルされ、適切に機能します。この構造体に渡された構造体ノードの文字ポインタにこの文字ポインタを割り当てようとすると、次のように問題が発生します。

int f1( struct node* new ){

したがって、次のように、構造内のポインターを配列へのポインターの値に割り当てようとします。

new->string = test;

しかし、私はセグメンテーション違反です。

私には、これはchar*を期待するものにchar*を割り当てているように見えるので、これは正常に機能するはずです...私はおそらく愚かな何かを見逃していますが、誰かが私を指す方向を持っていますか?どうもありがとう!

4

2 に答える 2

3

の発信者をf1()確認し、パラメータが有効であることを確認してください。

これは機能します:

struct node *you = malloc(sizeof(struct node));
if (you)
{
    f1(you);
    free(you);
} 

これもそうです:

struct node me;
f1(&me);

これは機能しません

struct node *me;
int f1(me);
于 2012-11-15T21:44:11.613 に答える
0

注意すべき観察事項:

  1. sizeof(char)定義によるものです。

  2. 推奨される呼び出し方法はmalloc、キャストを回避し、 sizeof を取得して、割り当てられているポインターから型を推測する方法です。(下記参照)

  3. などの識別子の使用は避けてくださいnew(可能な限り)。

  4. あなたが終わったら、内freeのメンバーに思い出してください。stringnode

#2を詳しく説明するには、以下を参照してください-

struct MyType *foo;
foo = malloc( n * sizeof *foo ); /* allocate n elements where n > 0 */

なんらかの理由で、foo を別の型にすることを選択した場合、malloc呼び出しで心配する必要のある行が 1 行少なくなります。また、stdlib.h をインクルードするのを忘れた場合は、コンパイラが知らせてくれます。

于 2012-11-15T22:24:24.930 に答える