【问题标题】:Malloc a string array - CMalloc 一个字符串数组 - C
【发布时间】:2013-09-20 12:08:00
【问题描述】:

我一直在尝试理解 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);

【问题讨论】:

  • 什么是“坏指针错误”?始终粘贴错误消息和您的输入,以便行为可重现。
  • 键数组有两个条目,但是一旦密码有多个字符,您就可以编写方式粘贴第二个元素。
  • 不确定你想做什么。无论如何,如果password字符串大于1个字符,keylen会大于1,所以key[i]会越界访问。
  • 为什么要使用 for 循环?您在 key 而不是 2 中创建了很多字符串并溢出。
  • @Zeta - 我单步执行了代码,当我到达 'key[i] = (char*)malloc(keylen * sizeof(char)); 时得到 '0xcccccccc ' '我的输入是“防御工事”

标签: c arrays string


【解决方案1】:

我认为您需要尝试并了解自己要达到的目标。您不需要 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);

【讨论】:

  • 好。更重要的是,您了解您的示例崩溃的原因吗?
  • 是的,指针声明错误,循环也是错误,再次感谢您的帮助
  • 你为什么要在 C 代码中转换 malloc()?另外,scanf() 不安全
  • 我的例子是修复原始文件所需的最少工作量。我不想通过完全重写他的整个作品来混淆 OP。如果这是 codereview,我会同意你的看法。
【解决方案2】:

你的问题在这里:

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

您将指针数组传递给 printf,而您想要做的是

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

还有一个问题是你分配的指针与密码中的字符一样多,所以你覆盖了你保留的指针数组,因为key只有两个指针的空间,而不是N,这是主要原因对于您的“坏指针”问题。

与此错误无关的另一件事是,您不应该转换 malloc,也不需要乘以 sizeof(char),因为根据定义,这将始终为 1。

【讨论】:

  • 你不认为问题在于如果输入3个或更多字符的密码key[i]试图写入无效内存吗?
  • 是的,这是另一个问题。我打字的速度不如那个代码中的错误。 :)
  • 这是keylen 循环。
  • 如果密码超过 2 个字符,您将溢出密钥数组。
  • void * 在 C 中自动兼容,您可以在转换时隐藏细微的错误。 stackoverflow.com/questions/605845/…
猜你喜欢
  • 2014-08-26
  • 2016-01-22
  • 1970-01-01
  • 2016-02-23
  • 2021-05-31
  • 1970-01-01
  • 2017-03-29
  • 1970-01-01
  • 2018-10-10
相关资源
最近更新 更多