web-dev-qa-db-ja.com

文字列配列をmalloc-C

私はmallocと文字列を理解しようとしていますが、誰かがこれを手伝ってくれませんか-悪いポインタエラーが発生します

char password[100];
char *key[2];   
int textlen, keylen, i, j, k, t, s = 0;

printf("password:\n") ;   
scanf("%s",password);

keylen = strlen(password) + 1;

for(i=0; i < keylen; i++)
{                
    key[i] = (char*)malloc(keylen * sizeof(char));
    strcpy(key[i], password);
}

printf("The key is:\n\t %s", key);
6
Dex Dave

自分が何を達成しようとしているのか、自分自身で理解する必要があると思うkey [2]配列は必要ありません。ポインタがどのように機能するのかまだ理解していないため、混乱していると思います。以下は機能するはずです(テストされていません)

// Allow a password up to 99 characters long + room for null char
char password[100];
// pointer to malloc storage for password
char *key;   
int textlen, keylen, i, j, k, t, s = 0;

// Prompt user for password
printf("password:\n") ;   
scanf("%s",password);

// Determine the length of the users password, including null character room
keylen = strlen(password) + 1;

// Copy password into dynamically allocated storage
key = (char*)malloc(keylen * sizeof(char));
strcpy(key, password);

// Print the password
printf("The key is:\n\t %s", key);
14
djgandy

あなたが持っている問題はここにあります:

_ printf("The key is:\n\t %s", key);
_

ポインタ配列をprintfに渡しているが、あなたがやりたいことは

_ printf("The key is:\n\t %s", key[0]);
_

さらに別の問題は、パスワードの文字数と同じ数のポインタを割り当てるため、予約したポインタ配列を上書きすることです。これは、keyには、Nではなく2つのポインタ用のスペースしかないため、「不良ポインタ」の主な原因です「問題。

また、このエラーに関連しないもう1つのことは、mallocをキャストしてはならず、sizeof(char)を乗算する必要がないことです。これは、定義により常に1になるためです。

5
Devolus