Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Malloc字符串数组-C_C_Arrays_String - Fatal编程技术网

Malloc字符串数组-C

Malloc字符串数组-C,c,arrays,string,C,Arrays,String,我一直在试图理解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++) { k

我一直在试图理解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);
char密码[100];
字符*键[2];
int textlen,keylen,i,j,k,t,s=0;
printf(“密码:\n”);
scanf(“%s”,密码);
keylen=strlen(密码)+1;
对于(i=0;i
您遇到的问题是:

 printf("The key is:\n\t %s", key);
您正在将指针数组传递给printf,而您要做的是

 printf("The key is:\n\t %s", key[0]);
另一个问题是,您分配的指针数量与密码中的字符数量相同,因此您会覆盖保留的指针数组,因为
key
只能容纳两个指针,而不能容纳N,这是导致“指针错误”问题的主要原因


另一件与此错误无关的事情是,你不应该施放malloc,也不需要与sizeof(char)相乘,因为根据定义,这永远是1。

我认为你需要尝试并了解自己想要实现的目标。您不需要键[2]数组,我认为您在这方面感到困惑,因为您还不了解指针是如何工作的。以下各项应有效(未经测试)


什么是“坏指针错误”?始终粘贴错误消息和您的输入,以使行为可重复。密钥数组有两个条目,但当密码包含多个字符时,您可以写入方式粘贴第二个元素。不确定您要执行什么操作。无论如何,如果
password
字符串大于一个字符,
keylen
将大于1,因此
key[i]
将是越界访问。为什么要使用for循环?您在key而不是2中创建了很多字符串,并导致溢出。@Zeta-我仔细检查了代码,当我到达'key[I]=(char*)malloc(keylen*sizeof(char));'时,得到了'0xcccc'我的输入是“强化”,你不认为问题在于,如果你输入一个3个或更多字符的密码,key[i]会试图写入无效内存吗?是的,这是另一个问题。我打字速度不如代码中的错误快。:)这是
keylen
循环。如果密码超过2个字符,您将覆盖密钥数组。
void*
在C语言中自动兼容,您可以在施放密码时隐藏细微错误。好。更重要的是,您了解示例崩溃的原因吗?是的,指针和循环的错误声明也是一个错误。再次感谢您的帮助。为什么要在C代码中强制转换
malloc()
?另外,
scanf()
是不安全的,例如对原始版本进行修复所需的工作量最少。我不想完全重写他的全部作品,从而混淆OP。如果这是codereview,我会同意你的观点。
// 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);