在C数组中不可赋值,为什么这个程序工作?

在C数组中不可分配,但在第36行(我也注释过的行)中,我给数组分配了一个值,名称为,但没有得到任何错误。这是为什么发生?此外,除了这个莫名其妙的事情,如果您检查我的freeStudents功能是否正常工作,我将非常感激。谢谢你的时间家伙!在C数组中不可赋值,为什么这个程序工作?

#include <stdio.h> 

#include <stdlib.h>

#define MAX_NAME 50

struct students

{

char name[MAX_NAME];

float average;

};

void storeStudents(struct students *lst, int n);

void printStudents(struct students *lst, int n);

void freeStudents(struct students *lst);

int main(void)

{

int n;

printf("How many students you wanna store? ");

scanf("%d", &n);

struct students *list;

list = (struct students *)malloc(n*sizeof(struct students));

storeStudents(list,n);

printStudents(list,n);

freeStudents(list);

return 0;

}

void storeStudents(struct students *lst, int n)

{

int i;

for(i=0;i<n;i++)

{

printf("Name of student: ");

scanf("%s", &(lst[i].name)); //In C arrays are not assignable, so why is this line working?

printf("Average of student: ");

scanf("%f", &(lst[i].average));

}

printf("\n");

}

void printStudents(struct students *lst, int n)

{

int i;

for(i=0;i<n;i++)

{

printf("Name: %s\tAverage: %.2f", lst[i].name, lst[i].average);

printf("\n");

}

}

void freeStudents(struct students *lst)

{

free(lst);

}

回答:

在C中,您不能将数组赋值给另一个数组,因为数组不能在赋值的左侧。所以如下:

char a[5] = { 1, 2, 3, 4, 5 }; 

char b[5];

b = a;

是不正确的。但是,当然,这是正确的:

b[0] = a[0]; 

b[1] = a[1];

b[2] = a[2];

b[3] = a[3];

b[4] = a[4];

因为b[0](这是*(b+0))不数组,但一个char

现在到了。在第36行,你做的事:

scanf("%s", &(lst[i].name)); 

解剖,再发表评论:不要使用scanf()用户输入。

无论如何,函数是一个变量参数函数,意味着它会高兴地接受任何你传递的作为第二个参数。但是你应该传递的是一个char*(一个指向char的指针)。为什么?因为设计函数的人决定如此:当格式字符串有%s时,你需要一个char*参数。

什么类型是&(lst[i].name)?表达式的类型为char[50](50个字符的数组),所以&(lst[i].name)是“50个字符数组的地址”,其在C中被称为“指向50个字符的数组的指针”或C语法char(*)[50]。这不是char*。所以这是错误的或更好的未定义的行为。

正确的版本应该是什么?那么,这样的:

scanf("%s", lst[i].name); 

,因为当你在表达式中使用数组它衰减的指针的第一个元素。

好的,但为什么它工作呢?它可能工作在一些编译器上,因为它们只是在这两种情况下传递数组的地址,所以在堆栈上这两个东西都是相同的数字。

最后,在这个表达式语句中没有“分配”数组,因此事实上这个问题在第一个地方是没有意义的。或者更好的是,函数接收数组的地址并使用指向第一个元素的指针填充它。另一个有趣的是你不能有数组参数的函数。只有指针。

以上是 在C数组中不可赋值,为什么这个程序工作? 的全部内容, 来源链接: utcz.com/qa/258408.html

回到顶部