我正在使用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
答案 0 :(得分:6)
您应该使用calloc
函数;这就是我经常使用的。它的作用与malloc()
相同,但是它使用0
初始化所有分配的位。
答案 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