6

私は 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);
4

2 に答える 2

16

自分が何を達成しようとしているのかを理解しようとする必要があると思います。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);
于 2013-09-20T12:26:50.530 に答える
5

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

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

ポインター配列をprintfに渡していますが、やりたいことは

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

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

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

于 2013-09-20T12:16:00.803 に答える