0

以下のような関数に渡す必要のある文字列があります。

scanf("%s%d",&name,&telno);
addatend(telno,name);

どこ

char name[MAX];

次の警告が表示されます:

warning: format ‘%s’ expects argument of type ‘char *’, but argument 2 has type ‘char (*)[50]’ [-Wformat]

もう1つのcharポインターとポイントを持つなどの変更を試みましたname。しかし、警告は残ります。

関数で私はstrcpyを持っています

strcpy(addnode->name,name1);

これは、構造内のnamefrommainからinに対処しています。しかし、このラインにはセグメンテーション違反があります。nameaddnode

スプリント(この行では問題はありませんでした)とvalgrindをチェックインしようとしましたが、間違いを特定できませんでした。したがって、助けを求めてここに来ました。前もって感謝します..

コード:

typedef struct Mystruct{
char *name;
int telno;
struct Mystruct *nextp;
}data;

void addatend(int telno1, char* name1)
{
    data *addnode, *previousnode;
    addnode = malloc (sizeof(data));

    if(addnode == NULL)
    {
        printf("Memory allocation failed...Exiting");
        exit(0);
    }

    strcpy(addnode->name,name1);        //error Part of the code.
4

2 に答える 2

3

を使用して文字列を読み取る場合scanf、配列はポインタとして関数に渡されるため、address-of演算子は必要ありません&


2番目の問題について...コピー先のメモリも割り当てる必要があります。の前に( 、を使用して、文字列ターミネータを)malloc再度使用するか、文字列を割り当ててコピーするを使用します。strlen(...) + 1+1strcpystrdup

addnode->name = strdup(name1);
于 2012-12-10T10:25:14.690 に答える
2

長さゼロの配列または柔軟な配列メンバーを使用して、構造体に名前を格納することもできます。ただし、これは最後の構造体メンバーである必要があります。これがあなたがそれを宣言する方法です。

typedef struct Mystruct {
    int telno;
    struct Mystruct *nextp;
    char name[];
} data;

関数では、あなたはします

data *addnode = malloc(sizeof(data) + strlen(name1) + 1);
strcpy(addnode->name, name1);
于 2012-12-10T12:52:50.870 に答える