scanf 输出中的奇怪字符

Bizarre characters in scanf output

我正在编写一个用于小型 C 程序的函数。该函数应该提示用户输入 n 7 位字母数字课程代码字符串,以及 return 这些字符串作为数组。我已经编写了一个我认为应该这样做的函数,但是我遇到了一些错误。

char ** getNCourses(int n) {
    char **courses;
    courses = malloc(n * sizeof(char));

    for (int i=0; i<n; i++) {
        printf(INQUIRY_COURSE_CODE"\n", i);
        courses[i] = malloc(8);
        scanf("%7s", courses[i]);
        flush();
    }

    return courses;
}

我有几行代码来打印所述数组的结果:

// prompt the user for course codes
char **pCourses;
pCourses = getNCourses(MAX_COURSES);

for (int i=0; i<MAX_COURSES; i++) {
    printf("%s ", pCourses[i]);
}

这里是程序的输出 运行。可以看出,输出的课程代码“已损坏”:

Registering 10 courses.
Please enter the 7-digit course code for course 0: 
CST8101
Please enter the 7-digit course code for course 1: 
CST8102
[...]
CST8109
Please enter the 7-digit course code for course 9: 
CST8110
�@�� CST8102 �@�� �@�� �@�� CST8106 CST8107 CST8108 CST8109 CST8110 % 

我不确定为什么有些课程代码显示没有问题,而另一些则完全不正确。我相信这不是读取数据的问题,而是实际分配内存和 returning 数组的问题,但我不知所措。

char **courses;
courses = malloc(n * sizeof(char));

courses 指向 char *。每个 char * 需要 sizeof (char *) 字节,而不是 sizeof (char) 字节。 n 个需要 n * sizeof (char *) 个字节。

你可以通过总是写 Pointer = malloc(n * sizeof *Pointer); 来避免这样的错误。然后 sizeof *Pointer 总是产生所指向类型的大小;你永远不必推断类型。它还会自动调整声明更改:如果编辑代码以更改指针的声明,sizeof 仍然是正确的,因为它使用指针来获取类型,而不是硬编码类型。