访问结构的 char 属性

Accessing char attribute of a struct

在我的代码中,我有一个函数可以初始化一个结构的新实例,它有一个 char 属性,同样的函数 returns 一个指向实例的指针。

但是当我尝试从不同的范围读取 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;
}

函数 getEntry returns 非静态局部变量的地址。在 main 中使用此地址是未定义的行为。可能对 printEntry 的调用会部分覆盖数据,这就是您看到不同输出的原因。

您尝试使用

为 returned 数据动态分配内存
Entry *pntEntry = malloc(sizeof(struct Entry));

但是你扔掉了这个内存的地址并用

分配你的局部变量的地址
pntEntry = &entry;

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

*pntEntry = entry;

与您的问题无关:

您的程序应该 free 所有分配的内存不再使用时。

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

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

编辑(回复评论):

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

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

中分配

您不能 free 内存 password,因为它指向局部变量 line 中的一个字符。如果您要为密码副本分配内存,例如使用 strdup,则有必要在释放 entry 之前释放 entry->password。这也将解决 entry->password 指向 line.

的元素的可能问题