【问题标题】:Having trouble setting array size from another array从另一个数组设置数组大小时遇到​​问题
【发布时间】:2019-07-24 13:25:29
【问题描述】:

我必须使用数组(字符串),并且我希望第二个用特殊字符(即“*”)填充,具体取决于第一个的大小。 例如,如果第一个是“TEST” 第二个应该是“****”

所以我有这个代码:

int i;
char arr_1[ ] = "TEST";
char *arr_2 = NULL;

arr_2 = malloc( strlen(arr_1) * sizeof(arr_1) );

if(arr_2 ==  NULL)
{
    printf("\nCouldn't allocate memory !");
    exit(0);
}

for(i = 0; i < strlen (arr_1); i++)
{
    arr_2[ i ] = '*';
}

printf("The new string is : %s ", arr_2);

free(arr_2);

问题是这实际上不起作用,当我运行它时,我得到“****■@!” (最后是星星和一些奇怪的字符)。

需要帮助,谢谢

【问题讨论】:

  • sizeof(arr_1) 等于5,因此您为arr_2 分配4 * 5 字节。 而且你必须记住,C 中的char 字符串实际上称为null-terminated 字节字符串。您不会终止 arr_2 中的字符串。
  • 无法重现错误。见here

标签: c arrays pointers dynamic-memory-allocation


【解决方案1】:

您分配的内存超出了要求。既然内存没有初始化,那么后面就是垃圾了。

用途:

malloc(sizeof(arr_1)/sizeof(arr_1[0]));

【讨论】:

  • 如果用明确的大小定义数组本身,它可能会更大。只需strlen(arr_1) + 1 就足够了。
【解决方案2】:

正如其他人评论的那样,您的字符串分配不够长。使用strlen,您需要分配strlen + 1。

arr_2 = malloc( strlen(arr_1) * sizeof(char) + 1);

当您通过for 循环复制字符串时,您需要NULL 终止字符串。

  int i;
  for (i = 0; i < strlen(arr_1); i++) {
    arr_2[i] = '*';
  }
  arr_2[i] = '\0';

上面的代码有效,因为for 循环所做的最后一件事是递增和比较i。这意味着i 等于字符串的长度。如果需要限制i的范围,将上面的代码包装在do { ... } while(0);

使用malloc 时,您应该始终假设分配的内存中充满了放射性垃圾数据。

【讨论】:

  • sizeof(char) 总是等于一。而不是循环,只需使用 strcpy()。
  • @FredK - 我建议将sizeof(arr_1) 切换为sizeof(char),因为在这种情况下sizeof(arr_1) == 5。 OP 可能想要sizeof(*arr_1)。如果程序员指望sizeof(arr_1) == 5,arr_1 可以很容易地衰减为指针,然后sizeof(arr_1_prime) == 8。我考虑过推荐strcpy() / strncpy(),但是当我尝试实现它时,它要复杂得多,而且似乎没有任何好处。
猜你喜欢
  • 1970-01-01
  • 2018-11-25
  • 2020-05-19
  • 1970-01-01
  • 1970-01-01
  • 2010-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多