【问题标题】:C all the value changes with the pointerC 所有值随指针变化
【发布时间】:2019-11-19 04:43:53
【问题描述】:

我正在尝试用 C 语言编写一个方法来读取文件。 我不知道文件会有多长时间,但我知道结构。 问题是,当我更改 str 的值时,所有引用它的 var 都会更改。有什么方法可以让我的变量值保持不变?很抱歉代码乱七八糟。

HashMap read_Table(char* srcfilename){
    FILE* src = fopen(srcfilename, "r");
    if (src == NULL) {
        printf("READ FILE FAILED\n");
    }
    char str[256];
    if (fgets(str, 255, src) != NULL) {
    }
    fgets(str, 255, src);
   char* attribute_size = str;
    int a_size = atoi(attribute_size);
    char **outAttributes = malloc(sizeof(char *) * a_size);
    fgets(str, 255, src);
    for(int i = 0; i<a_size; i++){
        if (fgets(str,255,src) != NULL){
            outAttributes[i] = str;
        }
    }
    fgets(str, 255, src);
    //get key size:
    printf("!!!!!!\n%s", str);
    fgets(str, 255, src);
    //get key size number
    printf("!!!!!!\n%s", str);
    char* key_size = str;
    int k_size = atoi(key_size);
    if (fgets(str, 255, src) != NULL) {
        //get Key:
        printf("!!!!!!\n%s", str);
    }
    char **outKeyItem = malloc(sizeof(char *) * k_size);
    for(int i = 0; i<k_size; i++){
        if (fgets(str,255,src) != NULL){
            printf("!!!!!!\n%s", str);
            outKeyItem[i] = str;
        }
    }
    fgets(str, 255, src);
    //get Table:
    HashMap out_map = new_HashMap((void**)outAttributes, a_size ,(void**)outKeyItem, k_size);
    while (!feof(src)) {
        char** curr_tuple = malloc(sizeof(char *) * a_size);
        for(int i=0;i<a_size;i++){
            if(fgets(str, 255, src)!=NULL){
                curr_tuple[i] = str;
                printf("Tuple: %d %s",i, curr_tuple[i]);
            } else{
                break;
            }
        }
        if(feof(src)){
            break;
        }
        insert(out_map, (void**)curr_tuple);
    }

    printHashMap(out_map);
    printf("\n");
    return out_map;
}

【问题讨论】:

  • 你需要分配内存来保存字符串,然后使用strcpy复制字符串。还有一个名为 strdup 的函数在某些系统上可用。

标签: c pointers memory-management


【解决方案1】:

您正在分配指针而不是复制内容。

        outAttributes[i] = str;
        outKeyItem[i] = str;

应该是

       outAttributes[i] = strdup(str); //basically malloc and strcpy
       outKeyItem[i] = strdup(str);

注意:: strdup 在内部分配内存并复制 内容因此您需要free 完成后strdup 不是c 标准。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-03-13
    • 1970-01-01
    • 2019-05-26
    • 2011-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多