如何使2D字符数组完全为空?

时间:2019-04-07 08:32:57

标签: c

我正在使用malloc创建一个2D数组,当我遍历该数组时,会有一些我不想要的字符和符号。数组不应该完全为空吗?

我尝试将空字符分配给每一行的开头,但这并没有改变任何内容。

    char **structure;
    structure = malloc(sizeof *structure * 2);
    if (structure) {
        for (size_t i = 0; i < 2; i++) {
            structure[i] = malloc(sizeof *structure[i] * 20);
            structure[i][0] = '\0';
        }
    }
    for (int i = 0; i <= 2; i++) {
        for (int j = 0; j < 20; j++) {
            printf("%c ", structure[i][j]);
        }
        printf("\n");
    }

我希望输出只是空白,但这是出现的情况:

Z Ñ             P  Ñ             l   L O
Z Ñ               P  Ñ             N U M B

4 个答案:

答案 0 :(得分:6)

您应该使用calloc函数;这就是我经常使用的。它的作用与malloc()相同,但是它使用0初始化所有分配的位。

calloc documentation

答案 1 :(得分:3)

访问每个字符时,必须明确清除所有位置以获取所需的输出。

char **structure;
structure = (char**)malloc( (sizeof *structure) * 2 );
if (structure)
{
    for(size_t i = 0; i < 2; i++){
        // structure[i];
    structure[i] =(char *) malloc( sizeof *structure[i] * 20 );
    for(int j=0; j<20; j++)
        structure[i][j] = '\0';

    }
}
for(int i = 0; i < 2; i++){ //you can not access position i==2
        for(int j = 0; j < 20; j++)
        {
            printf("%c ", structure[i][j]);

        }
        printf("\n");
    }

您还可以使用printf(“%s”,structure [i])使其与当前代码一起使用。因为您已经将两个字符串的第一个位置都设为NULL('\ 0'),所以它将起作用,因此printf函数将在两个字符数组都终止而无需打印任何内容。但是请记住,除了两个数组中的第一个数组之外的其他位置都将包含垃圾值。

答案 2 :(得分:1)

分配内存时,内存中的数据未定义。 malloc函数只是给您内存。 如果要将内存初始化为0,则可以始终使用标准的calloc函数。 如果要在分配后对其进行初始化,则可以始终使用memset函数。就您而言

void trier(){
  int echange;

  do{
    struct patient *ptr = tete;
    struct patient*prec=NULL;

    echange=0;

    while(ptr->suivant!=NULL){
      prec=ptr;
      ptr=ptr->suivant;
      if(strcmp(prec->nom,ptr->nom)<0){
        echangedeNom(prec,ptr);
        echangedePrenom(prec,ptr);
        echangedesentiers(prec,ptr);
        echangedesannes(prec,ptr);
        echange=1;
      }
    }
  }while(echange==1);
  printf("\n\n Trie Avec Succes ! \n");
}

答案 3 :(得分:1)

您并不是真正分配char的2D数组,而是分配2个指向20个char的数组的指针的数组。分配真正的2D数组要简单得多:

// allocate a 2D array and initialize it to null bytes
char (*structure)[20] = calloc(sizeof(*structure), 2);
for (int i = 0; i < 2; i++) {
    for (int j = 0; j < 20; j++) {
        printf("%02X ", structure[i][j]);
    }
    printf("\n");
}

输出:

00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00