c - 访问结构的 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**
,因为您不想修改指针。通过 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->password
您entry
要为密码副本分配内存,例如使用strdup
. 这也将解决entry->password
指向元素的可能问题line
。
推荐阅读
- javascript - 嵌套对象和函数变量
- python - django管理站点改为普通html
- php - left justify and right justify one element content in css
- javascript - 使用 Nodemailer 获取每天通过“无回复电子邮件”发送的电子邮件数量
- java - results.next() == false and there's no printing of data
- css - CSS background from SVG image not showing gradients
- wordpress - wordpress 从给定路由格式的参数中获取 id。定义和改变钩子
- java - 如何管理 gRPC-java 服务器方法中的阻塞代码?
- java - 使用 EditText 在 RecyclerView 中编辑重复项
- java - Spring 5 添加静态文件目录 webapp