从ScanF为char *赋值

时间:2013-09-16 05:45:16

标签: c pointers memory-management malloc

有人可以帮我理解为什么当我尝试打印出student_name的值时,它只会返回null吗?我在C中实现了一个基本哈希表,用于存储学生姓名,ID和2个测试。其他一切都正确存储,无论我尝试什么,我都无法设法保存student_name。我有两个结构,哈希表本身然后记录,我打算放在表格中的元素。字符串永远不会超过18个字符。

int main(){
    char op[1];
    int stu_id[1];
    int exam1[1];
    int exam2[1];
    char * student_name = (char*)malloc(18*sizeof(char));

    struct hashtable * dictionary = malloc(sizeof(struct hashtable));
    dictionary->size = 13;
    dictionary->table = malloc(13*sizeof(struct record *));

    if(dictionary==NULL||dictionary->table==NULL){
        printf("Unable to allocate memory for the dictionary.\n");
        return;
    }

    int i;
    int s = 13;
    while(i<s){
        dictionary->table[i]=NULL;
        i++;
    }

    while(scanf("%s %d %d %d %s", op, stu_id, exam1, exam2, student_name) !=EOF){

        if(*op=='i'){
            printf("Intializing %s\n", *student_name);
            add_item(dictionary, stu_id[0], exam1[0], exam2[0], student_name);
    }
    free(dictionary);
    free(student_name);
    return 0;

}

2 个答案:

答案 0 :(得分:1)

请记住,字符串始终必须包含特殊的终止符('\0')。这意味着长度为1的字符串(如op数组)实际上是两个字符。

这意味着当您读入op时,您实际上是在超出数组边界的情况下进行编写,导致未定义的行为。您需要增加op(至少两个)的大小,或将其声明为单个char(即不是数组)并使用'%c'格式代码来读取单个字符。

此外,不要将整数变量声明为数组,而是在调用&时使用address-of operator scanf

char op;
int stu_id;
int exam1;
int exam2;

/* ... */

scanf("%c %d %d %d %s", &op, &stu_id, &exam1, &exam2, student_name)

如果输入格式不正确,您也不应该检查scanfEOF的返回值。再次比较您想要扫描的值的数量,在您的情况下为五。

答案 1 :(得分:0)

我想你正在为add_item()中的学生记录分配内存,并将它们分配给dictionary-&gt;表。从你发布的代码中,你是分配内存来保存指向struct student记录的指针而不是记录本身。

你需要在main()的末尾释放为“dictionary-&gt; table”分配的内存。