访问结构的 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**
传递给 getEntry
和 separateBySpace
,因为您不需要' 想修改指针。通过 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
.
的元素的可能问题
在我的代码中,我有一个函数可以初始化一个结构的新实例,它有一个 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**
传递给 getEntry
和 separateBySpace
,因为您不需要' 想修改指针。通过 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
.