无法从另一个阵列设置阵列大小

时间:2019-03-02 20:44:20

标签: c arrays pointers dynamic-memory-allocation

我必须要数组(字符串),并且我要根据第一个字符的大小将第二个字符用特殊字符(即'*')填充。 例如,如果第一个是“ 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);

问题是这实际上没有用,当我运行它时,我得到“ ****■@!” (星号和一些怪异的字符)。

需要帮助,谢谢

2 个答案:

答案 0 :(得分:0)

您分配的内存超出了要求。由于内存未初始化,因此单词后面有垃圾。

使用:

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

答案 1 :(得分:0)

正如其他人所评论的那样,为您的字符串分配的时间不够长。使用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时,应始终假定分配的内存已充满了放射性垃圾数据。