如何解决访问结构的 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;
}
解决方法
函数 getEntry
返回非静态局部变量的地址。在 main
中使用此地址是未定义的行为。可能对 printEntry
的调用部分覆盖了数据,这就是您看到不同输出的原因。
您尝试为返回的数据动态分配内存
Entry *pntEntry = malloc(sizeof(struct Entry));
但是你扔掉了这个内存的地址并用
分配了你的局部变量的地址pntEntry = &entry;
您可能想要复制结构而不是指针。这将是
*pntEntry = entry;
与您的问题无关:
当您的程序不再使用时,它应该free
所有已分配的内存。
使用问题中显示的代码,没有必要将指向输入字符串的指针的地址作为类型 getEntry
传递给 separateBySpace
和 char**
,因为您没有想修改指针。传递一个 char*
就足够了。
在 separateBySpace
中,您返回一个指针数组,这些指针指向由 strtok
修改的输入字符串的字符。稍后在 getEntry
中,您将指针 password
分配给 Entry
结构中的指针。这意味着您不应更改作为参数传递给 getEntry
的字符串变量,否则 password´ string referenced in the returned
Entry` 结构将发生变化。
编辑(回复评论):
我认为在 getEntry
中您可以 free
分配在 separateBySpace
中的指针数组,因为所有值都已使用或复制到 Entry
结构中。
在程序结束时,您应该free
entry
指向的内存,该内存在 getEntry
中分配。
你不能free
内存password
,因为它指向你的局部变量line
中的一个字符。如果您要为密码的副本分配内存,则必须在释放 entry->password
之前释放 entry
,例如使用 strdup
。这也将解决 entry->password
指向 line
元素的可能问题。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。