首页 > 解决方案 > 访问结构的 char 属性

问题描述

在我的代码中,我有一个函数可以初始化结构的新实例,该实例具有 char 属性,并且相同的函数返回指向实例的指针。

但是当我尝试从不同的范围读取 char 属性时,我也会得到不同的字符。

您可以在下面找到我的代码以及结果。提前致谢!

主功能

这里字符打印正确。

int main(int argc, char const *argv[]) {
    char line[] = "2-11 f: fjdfffmffffrff";
    char *pnt = line;
    Entry *entry = getEntry(&pnt);
    printf("(main) min %d\n", entry->min);
    printf("(main) max %d\n", entry->max);
    printf("(main) character %c\n", entry->character); <-----
    printf("(main) password %s\n", entry->password);
    printEntry(entry);
    return 0;
}

功能

虽然在这里打印的字符是一些随机字符。

void printEntry(Entry * entry){
    printf("(function) min %d\n", entry->min);
    printf("(function) max %d\n", entry->max);
    printf("(function) character %c\n", entry->character); <--
    printf("(function) password %s\n", entry->password);
}

标准输出

这是结果。

(main) min 2
(main) max 11
(main) character f
(main) password fjdfffmffffrff
(function) min 2
(function) max 11
(function) character L
(function) password fjdfffmffffrff

编辑

入口结构

typedef struct Entry {
    int min, max;
    char character;
    char *password;
} Entry;

char **separateBySpace(char **stringPtr) {
    char **ptrArray = (char **) malloc(ARR_PTR_LEN * sizeof(char *));
    char delim[] = " ";

    char *ptr = strtok(*stringPtr, delim);
    ptrArray[0] = ptr;
    int x = 1;

    while (ptr != NULL) {
        if (x >= ARR_PTR_LEN) {
            break;
        }
        ptr = strtok(NULL, delim);
        ptrArray[x] = ptr;
        x++;
    }
    return ptrArray;
}


Entry *getEntry(char **stringPtr) {
    char **pntArray = separateBySpace(stringPtr);
    char *rules = pntArray[0];
    char *character = pntArray[1];
    char *password = pntArray[2];
    int *array = getRange(rules);
    Entry entry = {.min = *(array), .max= *(array + 1), .character = *(character), .password= password};
    Entry *pntEntry = malloc(sizeof(struct Entry));
    pntEntry = &entry;
    return pntEntry;
}

标签: cpointersstructchar

解决方案


函数getEntry返回一个非静态局部变量的地址。使用此地址main是未定义的行为。可能调用printEntry部分覆盖数据,这就是你看到不同输出的原因。

您尝试为返回的数据动态分配内存

Entry *pntEntry = malloc(sizeof(struct Entry));

但是你把这个内存的地址扔掉了,然后分配你的局部变量的地址

pntEntry = &entry;

您可能想要复制结构而不是指针。这将是

*pntEntry = entry;

与您的问题无关:

您的程序free在不再使用时应该全部分配内存。

使用问题中显示的代码,没有必要将指针的地址传递给输入字符串getEntryseparateBySpace作为类型char**,因为您不想修改指针。通过 achar*就足够了。

separateBySpace您返回一个指针数组,这些指针指向输入字符串的字符,这些字符由strtok. 稍后,getEntry您将指针分配给结构password中的指针Entry。这意味着您不应更改作为参数传递给 的字符串变量getEntry,否则password´ string referenced in the returned Entry 结构将更改。

编辑(回答评论):

我认为getEntry您可以free分配指针数组,separateBySpace因为所有值都已被使用或复制到Entry结构中。

在程序结束时,您应该free将指向的内存entry分配给getEntry.

你一定不要free内存password,因为它指向你的局部变量中的一个字符line。如果entry->passwordentry要为密码副本分配内存,例如使用strdup. 这也将解决entry->password指向元素的可能问题line


推荐阅读